我正在尝试将user_id添加到由父控制器构建的嵌套属性中,但它似乎没有达到预期的效果?
IE中。我有一个名为Place.rb的模型accepts_nested_attributes_for :reviews
和has_many :reviews, :as => :reviewable, :dependent => :destroy
嵌套属性工作正常,我在Places控制器中构建它,就像这样......
@review = @place.reviews.build(:user_id => current_user.id)
params[:place].merge(:user_id => current_user.id)
params[:place][:reviews_attributes].merge!(:user_id => current_user.id)* bad
@place = Place.new(params[:place])
这是原始的,对于获取user_id的地方模型,现在我也需要嵌套评论模型的user_id。地方和评论都有user_ids似乎很奇怪,但人们可以为同一个地方添加新评论......
可能是这样但不起作用:
@place = Place.new(params[:place].merge(:user_id => current_user.id, :reviews_attributes => { :user_id => current_user.id } ))
得到错误:undefined method
with_indifferent_access'为3:Fixnum`
或
@place = Place.new(params[:place].merge(:user_id => current_user.id, :reviews_attributes => { "0" => { :user_id => current_user.id }}))
添加了正确的user_id,但用NULL替换了评论的内容; - (
我以前通过表单添加用户,但是想通过控制器执行此操作,以便它只在创建时添加user_id,因为特定的评论可能会被其他人更新,我不希望更新从原始作者改变user_id ......
旧方法有效:
<%= e.label :content, "Review" %><br />
<%= e.text_area :content, :rows => 20, :class => 'jquery_ckeditor' %><br />
<%= e.hidden_field :user_id, :value => current_user.id %> #want to remove this line
但是通过控制器,带选项的构建方法没有效果?有任何想法吗?我不能通过构建来做到这一点吗?
日志中的输出:
Parameters: {"commit"=>"Submit", "action"=>"create", "city_id"=>"prague",
"controller"=>"places", "place"=>{"address"=>"fsdfsdf", "name"=>"sdfsdfsd",
"reviews_attributes"=>{"0"=>{"content"=>"<p>\r\n\tsdfsdfsdfsdfsdfsdfsdf sdfsdfsdf</p>\r
\n"}}, "website"=>"", "city_id"=>"1036", "place_type"=>"1"}}
答案 0 :(得分:4)
试试这个:
params[:place][:user_id] = current_user.id
params[:place][:reviews_attributes].each do |key, review|
review[:user_id] = current_user.id
end if params[:place][:reviews_attributes]
答案 1 :(得分:1)
假设您有params[:review]
作为属性'哈希,您需要执行merge!
:
params[:review].merge!(:user_id => current_user.id)
@review = @place.reviews.build(params[:review])
修改强>
我也假设您将使用create
方法。
编辑#2:
它不适用于new
方法,因为您可以在railsapi.com找到构建方法
“仅在关联对象时有效 已经存在,如果没有,那就不是了!“
编辑#3: 我不确定这是不是最好的方法,但我在这里测试过它有效......
你有这个参数:
{"commit"=>"Submit", "action"=>"create", "city_id"=>"prague",
"controller"=>"places", "place"=>{"address"=>"fsdfsdf", "name"=>"sdfsdfsd",
"reviews_attributes"=>{"0"=>{"content"=>"<p>\r\n\tsdfsdfsdfsdfsdfsdfsdf
sdfsdfsdf</p>\r\n"}}, "website"=>"", "city_id"=>"1036", "place_type"=>"1"}}
因此,您可以通过以下方式访问评论的属性:params[:place][:reviews_attributes]
,并且要合并user_id
属性,您可以执行以下操作:
params[:place][:reviews_attributes].each_value {
|v| v.merge!(:user_id => current_user.id)
}
现在params[:place][:reviews_attributes]
看起来像这样的例子:
{"0"=>{
"user_id"=>"1",
"content"=>"<p>\r\n\tsdfsdfsdfsdfsdfsdfsdf sdfsdfsdf</p>\r\n"
}}
答案 2 :(得分:1)
您可能希望也可能不希望在包含user_id的表单中添加隐藏字段。然后params散列已经有了值。如果您担心篡改,可以将其与current_user.id进行比较。那么,也许这就是为什么你这样开始尝试呢?
答案 3 :(得分:0)
也许您使用的form_for语法很差。在查看此内容后,我已使用hidden_fields退出:http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for
和这个评论:(上帝保佑你,nachocab!)
nachocab - 2008年11月2日params hash自动获取模型ID
params哈希自动获取 填充每个模型的ID 传递给form_for。要是我们 正在创作一首歌 现有专辑:
网址:/ albums / 209 / songs / new form_for [@album,@ song]做| f | ... f.submit“添加”结束
params hash将是:
params = {“commit”=&gt;“添加”, “authenticity_token”=&gt; “中...”, “album_id”=&gt; “中209”, “歌曲”=&GT; { “song_attributes”=&GT; {...}} }
所以,在songs_controller你可以 在before_filter中使用此album_id:
before_filter:find_album
protected def find_album @album = Album.find(params [:album_id])结束如果你只这样做:
form_for @song do | f |
你会得到这个参数哈希:
params = {“commit”=&gt;“添加”, “authenticity_token”=&gt; “中...”, “歌曲”=&GT; { “song_attributes”=&GT; {...}} }