2011-03-22 15 views
2

私はチュートリアルに従ってブログアプリケーションを作成しました。だから私は投稿とコメントがあります。投稿フォームのフィールドの検証は完全に機能します。ポストのコメントセクションの検証も同様に動作しますが、エラーを表示することはできません。ruby​​ on rails has_many関連フォーム子どもの妥当性確認

コメントモデル:

 
    class Comment 
     belongs_to :post 
     validates :commenter, :presence => true 
    end 

コメントコントローラ:

 
    def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.build(params[:comment]) 
    if @comment.save 
     redirect_to post_path(@post) 
    else 
     render :template => 'posts/show' 
    end 
end 
    def destroy 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.find(params[:id]) 
    @comment.destroy 
    render :template => 'posts/show'  
    end 

ポストコントローラ:

 
    def index 
    @posts = Post.all 
    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
    end 
    end 
    def show 
    @post = Post.find(params[:id]) 
    @comment = @post.comments.build #added 
    #@comment = @Comment.new #added 
    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 
    def new 
    @post = Post.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 
    def edit 
    @post = Post.find(params[:id]) 
    end 
    def create 
    @post = Post.new(params[:post]) 

    respond_to do |format| 
     if @post.save 
     format.html { redirect_to(@post, :notice => 'Post was successfully created.') } 
     format.xml { render :xml => @post, :status => :created, :location => @post } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
    def update 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     if @post.update_attributes(params[:post]) 
     format.html { redirect_to(@post, :notice => 'Post was successfully updated.') } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
    def destroy 
    @post = Post.find(params[:id]) 
    @post.destroy 
    respond_to do |format| 
     format.html { redirect_to(posts_url) } 
     format.xml { head :ok } 
    end 
    end 

そして、私は、フォームで使用します。

<%= form_for([@post, @post.comments.build]) do |f| %>

コメントにはどのようなエラーがありますか?私が試してみると、私はいつも取得します:未知のメソッド `errors 'またはnilオブジェクト。

私は完全にレールが新しくなっています。

ありがとうございます!

Picki

+0

あなたはレールのどのバージョンを使用しているアプリケーションに応じて、詳細情報 - あなたのコントローラに代わり、このような何かをコメントを

を作成しますか? –

+0

私はRails 3.0.5を使用しています – picki

答えて

3

問題は、あなたが新しいコメントたびにフォームをロードしているを構築していること、です。このように、検証エラーのコメントはあなたのフォームには決して入れません。

# posts controller 
def show 
    @post = Post.find(params[:id]) 
    @comment = Comment.new 
end 

# comments controller 
def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.build(params[:comment]) 
    if @comment.save 
    redirect_to @post 
    else 
    render :new 
    end 
end 

そして、あなたのフォームを変更します:

<%= form_for([@post, @comment]) do |f| %> 
+0

こんにちは!今私はcomment.errorsを得ることができます。完璧に動作します。ありがとう! – picki

+0

しかし、今私は新しい問題を抱えています。私は新しい投稿を作成するときに、私はいつも空のコメントを添付しています。もし私がそれを破壊したいのであれば、私は "経路が一致しません"を得ます。あなたもこれで私を助けてください。ありがとう!よろしく、ピギー – picki

+0

私の更新版をお試しください。 – polarblau