2017-12-01 13 views
0

私は標準が属しており、PostCommentの間に多くの関係があります。ネストされたリソースを持たない子フォーム内で親IDを渡す方法

コメントフォームで使用される newアクションのポストIDを提供し、私は %li= link_to 'New comment', new_comment_path(post_id: @post.id)呼んで私のポストショービュー内の今
#post.rb 
class Post < ApplicationRecord 
    has_many :comments 
end 

#comment.rb 
class Comment < ApplicationRecord 
    belongs_to :post, dependent: :destroy 
end 

#routes.rb 
resources :posts 
resources :comments, except: [:index, :show] 

。 URLは次のようになります。 /comments/new?post_id=6

ここで問題が発生します。フォームを埋めると、post_idは引き継がれず、作成アクションに送られず、Post must existというエラーが出ます。 paramsハッシュを見ると、明らかにpost_idが見つかりません。

質問post_idを渡して新しいCommentを作成するにはどうすればよいですか?ネストされたルートの他に別の方法がありますか?もしそうなら、それは望ましい(またはRailsの)方法ですか?おそらくresourcesメソッドから指定されたcreateのカスタムルートを作成する必要がありますか?

ネストされたルートを使用してこの問題を解決できることがわかっています。作成アクションは、親ID(Post)を見つけるための適切なURLを持つためです。しかし、私はRailsの内部動作をより完全に理解しようとしているので、代替方法を見つけることを試みています。

答えて

1

あなたは、コメントフォームでhidden_field_tagをウッシング:post_idを渡すことができます。

<%= form_with model: @comment do |form| %> 
    <%= form.hidden_field :post_id, value: params[:post_id] %> 

    <%# ... other comment fields %> 

    <%= form.submit %> 
<% end %> 

今すぐあなたのコントローラの:post_id:comment

# comments_controller.rb 

def create 
    @post = Post.find(params[:comment][:post_id]) 
    @comment = @post.comments.build(comment_params) 

    if @comment.save 
    redirect_to @post 
    else 
    render :new 
    end 
end 

hidden_field() API documentationについてを参照してくださいの属性として渡されアクションを作成より多くの例。

+0

これは機能しました。これを達成する他の方法を知っていますか? – Lotix

+0

私は他の方法については気づいていませんが、 'Comment'は常に' Post'に関連しなければならないので、ネストされたルートを使うのが最良の解決策だと思います。 – s3tjan