accept_nested_attributes_for的构建参数问题

时间:2010-04-27 13:48:59

标签: ruby-on-rails modeling nested-forms nested-attributes

我正在尝试将user_id添加到由父控制器构建的嵌套属性中,但它似乎没有达到预期的效果?

IE中。我有一个名为Place.rb的模型accepts_nested_attributes_for :reviewshas_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"}}

4 个答案:

答案 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散列已经有了值。如果您担心篡改,可以将其与c​​urrent_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; {...}}               }