2013-07-23 22 views
19

私はRailsGuidesチュートリアル(ブログアプリケーションの作成)を進めています。私がサーバを起動して開いたとき:/posts/newすべてがうまく見えます。しかし、私はポストを作成しようとすると、私はこのエラーを取得:"未定義メソッド` title for nil:NilClass "Railsガイドチュートリアル

NoMethodError in Posts#show

Showing /home/darek/rails_projects/blog/app/views/posts/show.html.erb where line #3 raised:

undefined method `title' for nil:NilClass

抽出されたソース(ライン#周り3):実際のポストで

1 <p> 
2 <strong>Title:</strong> 
3 <%= @post.title %> 
4 </p> 
5 <p> 

が作成され、私はタイトルと内容を見ることができますat/posts しかし、私はこの特定の投稿を表示しようとするとこのエラーが出ます。 私の最初の手がかりは

<%= @post.try(:title) %> 

エラーがなくなっているにライン

<%= @post.title %> 

変更することでしたが、問題が解決されていません。
特定の投稿を表示しようとすると、タイトルとテキストフォームが空になります。また、私が見たいものではありません。

[OK]を、ここにコード

Show.html.erb

がある
<p> 
    <strong>Title:</strong> 
    <%= @post.title %> 
</p> 

<p> 
    <strong>Text:</strong> 
    <%= @post.text %> 
</p> 


<h2>Add a comment:</h2> 
<%= form_for([@post, @post.comments.build]) do |f| %> 
    <p> 
    <%= f.label :commenter %><br /> 
    <%= f.text_field :commenter %> 
    </p> 
    <p> 
    <%= f.label :body %><br /> 
    <%= f.text_area :body %> 
    </p> 
    <p> 
    <%= f.submit %> 
    </p> 
<% end %> 

<%= link_to 'Edit Post', edit_post_path(@post) %> | 
<%= link_to 'Back to Posts', posts_path %> 

)Posts_controller.rb

class PostsController < ApplicationController 

    def new 
    @post = Post.new 
    end 

    def index 
    @posts = Post.all 
    end 

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

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

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

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

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

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

     if @post.update(params[:post].permit(:title, :text)) 
     redirect_to @post 
     else 
     render 'edit' 
     end 
    end 

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

     redirect_to posts_path 
    end 
end 

レーキルート:

-VirtualBox:~/rails_projects/blog$ rake routes 
      Prefix Verb URI Pattern         Controller#Action 
    post_comments GET /posts/:post_id/comments(.:format)   comments#index 
        POST /posts/:post_id/comments(.:format)   comments#create 
new_post_comment GET /posts/:post_id/comments/new(.:format)  comments#new 
edit_post_comment GET /posts/:post_id/comments/:id/edit(.:format) comments#edit 
    post_comment GET /posts/:post_id/comments/:id(.:format)  comments#show 
        PATCH /posts/:post_id/comments/:id(.:format)  comments#update 
        PUT /posts/:post_id/comments/:id(.:format)  comments#update 
        DELETE /posts/:post_id/comments/:id(.:format)  comments#destroy 
      posts GET /posts(.:format)       posts#index 
        POST /posts(.:format)       posts#create 
     new_post GET /posts/new(.:format)      posts#new 
     edit_post GET /posts/:id/edit(.:format)     posts#edit 
      post GET /posts/:id(.:format)      posts#show 
        PATCH /posts/:id(.:format)      posts#update 
        PUT /posts/:id(.:format)      posts#update 
        DELETE /posts/:id(.:format)      posts#destroy 
      root GET /           welcome#index 
        GET /posts/:id(.:format)      posts#view 
        DELETE /posts/:id(.:format)      posts#destroy 

ありがとうfまたは助けと興味!

+0

Rubyの空白問題!この行はソースコード内で正しくインデントされていますか? '@post = Post.new(params [:post] .permit(:title、:text))'? 'redirect_to @ post'と' params.require(:post).permit(:title、:text) 'も適切にインデントされていません。 –

+0

申し訳ありません@アンドレディオン..それは重要ではありません。はい、それは適切にインデントされている場合、きれいに見えます。 –

+0

あなたの@postオブジェクトにはtitleが入っていますか? –

答えて

57

あなたはメソッドを非公開にしました。プライベートキーワードをどこに置くか忘れないでください。それ以下のすべてのメソッドはプライベートになり、このようなメソッドを定義します。コントローラの最後のプライベートメソッド:

class PostsController < ApplicationController 

def new 
    @post = Post.new 
end 

def index 
    @posts = Post.all 
end 

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

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

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

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

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

    if @post.update(params[:post].permit(:title, :text)) 
    redirect_to @post 
    else 
    render 'edit' 
    end 
end 

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

    redirect_to posts_path 
end 



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

end 

希望します。ありがとう

+1

これはRailsの初心者には本当に便利です。ありがとうございます –

+4

+1 **はプライベートキーワードを置く覚えています。その下のすべてのメソッドはプライベートになります** – lee

+0

ありがとう!チュートリアルの作者は、その事実を語っているに違いありません。 – sdweldon

0

私はこれらの同じ手順を実行し、同じ問題を解決したので、チュートリアルには誤植があります。しかし、私はチュートリアルに従っていた

def create 
    @post = Post.new(post_params) 

    @post.save 
    redirect_to @post 
end 

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

チュートリアルに従うときと同じ問題が発生しました。私のコードをもう一度チェックして理由を見つけました。 posts_controller.rbファイルでは、プライベートメソッドをコードの途中に置くことはできません。つまり、以下のすべてのメソッド(show、editなど)は非公開になります。代わりにプライベートメソッドを次のように下に置きます。

class PostsController < ApplicationController 
    def new 
    end 
    def index 
     @posts = Post.all 
    end 
    def create 
     @post = Post.new(post_params) 
     @post.save 
     redirect_to @post 
    end 
    def show 
     @post = Post.find(params[:id]) 
    end 
    private 
     def post_params 
      params.require(:post).permit(:title, :text) 
     end 
end 

あなたの問題を解決したいと考えています。

1

私の場合は、クラス定義(maps_controller)の下に、この行を書いていませんでした。

class MapsController < ApplicationController 
    before_action :set_map, only: [:show, :edit, :update,:destroy] 
    ... 
    end 

地図は、その行を書いた後、私のモデルであり、私の見解で働いていました。パブリックコードをプライベートメソッドの下に置かないように注意してください。

0

私にとって、show.html.erbを作成した後にbin/rakeルートを再実行するだけで問題は解決しました。命令は以前にこれを行うよう呼び出されましたが、直ちにそれをやり直すことは、他のものを変更することなく問題を解決しました(私のプライベートは私のファイルの最後のものでした。

0

私も同じチュートリアルで同じエラーが発生しました。すでにレールのエキスパートがすでに技術的に質問に答えています。 しかし、私はそのコンセプトを理解するための最初のビデオを完成させてから、二度目に彼と一緒に作ろうとしたかっただけです。 著者は、彼は説明して溶液とのビデオで私たちにこのエラーを示して実際には、同じビデオでソリューションを提供します上記の問題のために

(OUとしてすでに今知っているかもしれないが、私は私のような誰かのために答えています誰でしょう初めてこの質問にアクセスする)。この段階で私たちは皆新しいものだが、最初はビデオのコンセプトを理解してから手を振る。

0

私はこれが古いと知っていますが、これはこの問題をグーグルで見つけたときに現れた最初の投稿だったので、このスレッドへの道を見つけた他の人を助けたかったのです。

問題を解決する別の方法が見つかりました。私はarticles_controller.rbでprivateキーワードをpublicに変更して保存しました。http://localhost:3000/articles/new に行き、新しい記事を作成しました。

セーブ記事をヒットしたとき、それは私が元に戻って、プライベートに保存して、articles_controller.rbを保存していました。方法はプライベートでした。

1

私はこの問題を抱えています。すべてのプロセスとコードを確認しましたが、すべてチュートリアルと同じです。最後に は、ターミナルで私が実行します。

3000は、この問題を解決:

rake db:drop,  
rake db:create,  
rake db:migrate 

は、ローカルホストを再度開き、サーバーを再起動します。

関連する問題