如何在没有嵌套资源的情况下在子表单中传递父ID

时间:2017-12-01 21:12:40

标签: ruby-on-rails ruby-on-rails-5

我有一个标准属于PostComment之间有许多关系。

#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]

现在在我的帖子节目视图中,我打电话 %li= link_to 'New comment', new_comment_path(post_id: @post.id),其中提供了与评论表单一起使用的new操作的帖子ID。该网址如下所示: /comments/new?post_id=6

现在问题发生了。填写表单后,post_id不会被转移也不会被发送到创建操作,我收到错误Post must exist。查看params哈希值,显然找不到post_id

问题:如何通过post_id并构建新的Comment?除了嵌套路由之外还有其他方法吗?如果是这样,是否可取(或Rails方式)?我是否应该创建自定义路由并覆盖create方法提供的resources

我知道我可以通过使用嵌套路由来解决这个问题,因为这时create操作将有适当的url来查找父ID(Post)。但是,我试图更加彻底地理解Rails的内部工作方式,所以我试图寻找其他方法。

1 个答案:

答案 0 :(得分:1)

您可以在评论表单中传递"1 2 3 4 5" :post_id

hidden_field_tag

现在,在您的控制器的创建操作中,<%= form_with model: @comment do |form| %> <%= form.hidden_field :post_id, value: params[:post_id] %> <%# ... other comment fields %> <%= form.submit %> <% end %> 作为:post_id

的属性传递
:comment

有关更多示例,请参阅hidden_field() API documentation