2013-08-08 13 views
17

私は現在、RoRを教えてチュートリアルをやっていますが、ブートストラップを使ってレイアウトや素材を追加しています。見つけ出す。"未定義のメソッド` errors for 'nil:NilClass "エラー時に呼び出す方法

私は、検証部分(http://guides.rubyonrails.org/getting_started.html#adding-some-validation)をやろうとしていますが、私は使用している場合:

<% @post.errors.any? %> 

私はこのメッセージが表示されます。

undefined method `errors' for nil:NilClass 
Extracted source (around line #9): 
<legend><h1>Add Post</h1></legend> 

<%= form_for :post, url: posts_path, html: {class: 'form-horizontal'} do |f| %> 
     <% if @post.errors.any? %> 
     <div id="errorExplanation"> 

何も機能していないと私もコピーしてパーツを貼り付けチュートリアルから。ここで

は、ビューのコードです:

<p> </p> 

<div class="span6" 

<fieldset> 
    <legend><h1>Add Post</h1></legend> 

    <%= form_for :post, url: posts_path, html: {class: 'form-horizontal'} do |f| %> 
      <% if @post.errors.any? %> 
      <div id="errorExplanation"> 

       <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2> 

       <ul> 
        <% @post.errors.full_messages.each do |msg| %> 
        <li><%= msg %></li> 
        <% end %> 
        </ul> 
      </div> 
    <% end %> 
     <div class="control-group"> 
      <%= f.label :title, :class => 'control-label' %> 
      <div class="controls"> 
       <%= f.text_field :title, :class => 'span4' %> 
      </div> 
     </div> 

     <div class="control-group"> 
      <%= f.label :content, :class => 'control-label' %> 
      <div class="controls"> 
       <%= f.text_area :content, :rows => '7', :class => 'input-block-level' %> 
      </div> 
     </div> 

     <div class="form-actions"> 
      <%= f.submit "Add Post", :class => 'btn btn-success' %> 
      <%= link_to "Cancel", posts_path, :class => 'btn', :style => 'float:right;' %> 
     </div> 
    <% end %> 
</fieldset> 

</div> 

そして、私のposts_controller:

class PostsController < ApplicationController 

    def new 
    end 

    def create 
     @post = Post.new(params[:post].permit(:title, :content)) 

     if @post.save 
      redirect_to @post 
     else 
      render 'new' 
     end 
    end 

    def show 
     @post = Post.find(params[:id]) 
    end 

    def index 
     @posts = Post.order("created_at desc") 
    end 

    private 
     def post_params 
      params.require(:post).permit(:title, :content) 
     end 

end 

私は何をしないのですか?前もって感謝します!

答えて

51

newアクションでも@postを定義する必要があります。

def new 
    @post = Post.new 
end 

@postは、あなたが最初newアクションにフォームをロードは値(それはnilです)を持っていないので、あなたはNilClassエラーを取得しています。

あなたcreateアクションでrender :newを行うと、それはあなたがcreateの一番上に定義した@postを使用しているため問題はありません。

+0

@Deefourこんにちは。私は同じチュートリアルをしていて、 '5.12 Updating Posts'で同じエラーが発生します。 '@ post'変数は新しいメソッドで定義され、このエラーをスローし続けます。あなたは私を助けることができます? – Demnogonis

+0

私は同じ問題を抱えていました。このチュートリアルの上部では、Newアクションに.Newと書かなければならないことは明白です。 – DennyHiu

1

posts.controller.rbファイルのcreateメソッドを、次のコードで更新します。それは私のために働いた。

def create 
    @post = Post.new(params[:post].permit(:title, :text)) 
    @post.save 
    redirect_to @post 
end 
-2
def new 
    @article = Article.new 
end 
関連する問題