假设带有嵌套资源的 Post
- Comment
模型:
resources :posts do
resources :comments
end
app/views/comments/_form.html.haml
(erb 也可以)应该是什么样子,以便它还提供要附加评论的帖子的 ID?
目前我知道的唯一一种方法是手动添加带有帖子 ID 的隐藏输入。我觉得它很脏。
还有什么更好的办法吗?我希望 Rails 能够理解嵌套资源并自动包含 post_id
作为隐藏输入。
= form_for [@post, @comment] do |f|
.field
f.label :body
f.text_field :body
hidden_field_tag :post_id, @post.id
.actions
= f.submit 'Save'
编辑:使用 Mongoid,而不是 ActiveRecord。
谢谢。
最佳答案
帖子的 ID 实际上位于 URL 中。如果您输入rake routes
进入您的终端/控制台,您将看到嵌套资源的模式定义如下:
POST /posts/:post_id/comments {:controller=>"comments", :action=>"create"}
看一下 form_for
吐出的 HTML方法,具体看action
<form>
的网址标签。您应该看到类似 action="/posts/4/comments"
的内容。
假设您已定义 resources :comments
仅在您的 routes.rb
中一次 ,作为 resources :posts
的嵌套资源,那么您可以安全地修改 CommentsController#create
行动如下:
# retrieve the post for this comment
post = Post.find(params[:post_id])
comment = Comment.new(params[:comment])
comment.post = post
或者您可以简单地传递params[:post_id]
至comment
像这样的实例:
comment.post_id = params[:post_id]
我希望这会有所帮助。
有关嵌套表单/模型的更多信息,我建议观看以下 Railscast:
关于ruby-on-rails - form_for 与关联 - 如何提供父 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4173832/