2012-02-21 9 views
1

ブログエンジンを書くので、投稿、コメントリスト、コメントフォームを表示する投稿ビュー(show.html.erb)があります。他のコントローラから呼び出されたフォームを検証する

私は、フォームをこのように呼ん:

<%= render :partial => 'comments/form', :locals => {:comment => @post.comments.new} %> 

イムない確実な方法は正しいですが、少なくとも私は新しいコメントのpost_idのを得ることをコメントを渡す場合。

<%= form_for comment, :action => "create" do |f| %> 
    <% if comment.errors.any? %> 
     <div id="error_explanation"> 
      <h2><%= pluralize(comment.errors.count, "error") %> prohibited this comment from being added:</h2> 

      <ul> 
      <% comment.errors.full_messages.each do |msg| %> 
       <li><%= msg %></li> 
      <% end %> 
      </ul> 
     </div> 
    <% end %> 

    <%= f.hidden_field :post_id %> 
    <p> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
    </p> 
    <p> 
    <%= f.label :email %> 
    <%= f.text_field :email %> 
    </p> 
    <p> 
    <%= f.label :url %> 
    <%= f.text_field :url %> 
    </p> 
    <p> 
    <%= f.label :content %> 
    <%= f.text_area :content %> 
    </p> 
    <p class="no-border"> 
    <%= f.submit "Post", :class => "button" %> 
    </p> 
<% end %> 

そして、このアクション:

これは私のフォームは、(コメントのビューで_form.html.erb)である

def create 
    @comment = Comment.new(params[:comment]) 

    respond_to do |format| 
     if @comment.save 
     format.html { redirect_to :back } 
     else 
     format.html { redirect_to :back } 
     end 
    end 
    end 

少し冗長が、私はより多くのものを追加したいです。

コメントを完全に追加できますが、検証エラーは表示されません。

私は(私のモデルは、検証のものを持っている)すべて空白のままに、私はで作成したコメントがエラーを持っているし、他のパスに行くアクションを作成することを参照してください。

ただし、フォームにエラーは表示されません。

私はerorrsとオブジェクトを持っていると思いますが、私が戻ってリダイレクトすると、フォームに渡すオブジェクトは再び新しいものになり、エラーは発生しません。

だからどこに問題がありますか?

EDIT:余分なもの:

イム私のshow.html.erb私もこの(フォームの前に)持っている:ショーアクションで、私は余分を置くとき、そう

<ol class="commentlist"> 
    <%= render @post.comments %> 
</ol> 

を変数:

def show 
    @post = Post.find(params[:id]) 
    @comment = @post.comments.new 

レンダリングも空のコメントをレンダリングして例外を作成すると思われます。

これを回避するにはどうすればよいですか?

答えて

1

リダイレクトすると、PostsController#showアクションが再び呼び出され、すべてのインスタンス変数がリセットされます。あなたが失敗したCommentsController#create呼び出した後の状態を保存したい場合、あなたはまた、ことを確認する必要があります現在のアクション

def create 
    # assuming you have nested the comments routes underneath posts... 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.build(params[:comment]) 

    respond_to do |format| 
     if @comment.save 
     format.html { redirect_to :back } 
     else 
     format.html do 
      # remember to declare any instance variables that PostsController#show requires 
      # e.g. @post = ... 
      render 'posts/show' 
     end 
     end 
    end 
end 

で宣言されたインスタンス変数を再利用しますrender 'posts/show'代わりのredirect :backを呼び出す必要があります代わりに新しいコメントを作成するための部分的な使用@commentたび

<%= render :partial => 'comments/form', :locals => {:comment => @comment } %> 

そして必ずPostsController@comment

を宣言します

覚えておくべき最も重要なことは、失敗したcreate呼び出し内のコードが、アクションテンプレートに必要なすべてのインスタンス変数を初期化していないとエラーが発生することを確認することです。

+0

恐ろしい答えです。私は別の質問があります。 createメソッド内に@postを作成する必要がある場合は、投稿IDが必要です。そのIDは作成する要求のどこかにありますか? –

+0

あなたのルートをネストしたと仮定すると、 '' 'params [:post_id]' ''を使ってアクセスする必要があります。 '' 'rake routes'''をチェックして、あなたのコメントのパスが' '' posts/1/comments''のように投稿の下に入れ子になっていることを確認してください。 –

+0

Nop、これは私の最初のプロジェクトです。しかし、私はそれを研究します。 Otoh、私は前にコメントするのを忘れてしまったあなたの解決策に別の問題があるので、質問を更新しました。 –

関連する問題