ruby-on-rails - form_for 与关联 - 如何提供父 ID?

标签 ruby-on-rails ruby rest view formbuilder

假设带有嵌套资源的 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/

相关文章:

python - RESTful更新密码

ruby - 通过 Ruby 中字符串中存在的字符来定义实例变量

ruby - 如果存储桶中已存在确切文件,则不要上传到 aws s3

ruby - BSON::ObjectId 与 Mongo::ObjectID

.net - 永远不会调用 ASP.NET Web API 自定义 JsonConverter

rest - 如何在没有传输编码的情况下发送 POST 请求 :chunked from Jersey ReST Client 2. 22.2

ruby-on-rails - 光纤局部变量与线程局部变量

ruby-on-rails - 防止Rails中重复记录的正确方法

ruby-on-rails - 使用 Ruby on Rails 的表单助手

ruby-on-rails - "Cheatsheet"还是Rails初学者的 list ?