3

我正在尝试将 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 的 place 模型,现在我也需要用于嵌套评论模型的 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' for 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

4 回答 4

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]
于 2010-04-27T16:44:38.017 回答
1

假设你有params[:review]作为属性的哈希,你需要做一个merge!

params[:review].merge!(:user_id => current_user.id)
@review = @place.reviews.build(params[:review])

编辑: 我还假设您将使用 this is oncreate方法。

编辑#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"
}}
于 2010-04-27T14:15:04.013 回答
1

您可能希望也可能不希望在包含 user_id 的表单中添加隐藏字段。然后 params 哈希将已经具有该值。如果您担心篡改,可以将其与 current_user.id 进行比较。话又说回来,也许这就是为什么您要以这种方式开始尝试的原因?

于 2010-10-01T12:42:54.463 回答
0

也许您使用的 form_for 语法很差。看了这个之后,我已经退出使用 hidden_​​fields:http: //apidock.com/rails/ActionView/Helpers/FormHelper/form_for

和这个评论:(上帝保佑你,nachocab!)

nachocab - 2008 年 11 月 2 日 params hash 自动获取模型 ID

params 哈希会自动填充传递给 form_for 的每个模型的 id。如果我们在现有专辑中创建歌曲:

URL:/albums/209/songs/new form_for [@album, @song] do |f| ... f.提交“添加”结束

参数哈希将是:

params = {"commit"=>"Add", "authenticity_token"=>"...", "album_id"=>"209", "song"=>{"song_attributes"=>{...}} }

因此,在songs_controller 中,您可以在before_filter 中使用这个album_id:

before_filter :find_album
protected def find_album @album = Album.find(params[:album_id]) end

如果你只这样做:

form_for @song 做 |f|

你会得到这个参数哈希:

params = {"commit"=>"Add", "authenticity_token"=>"...", "song"=>{"song_attributes"=>{...}} }

于 2010-10-03T03:44:46.500 回答