大家好我想从控制器设置参数。 我有嵌套的params,其中有很多。我想迭代参数并设置它们的值。
这是我的请求模型,它具有嵌套模型filled_cartrdige:
has_many :filled_cartridges, inverse_of: :request, dependent: :destroy
accepts_nested_attributes_for :filled_cartridges , allow_destroy: true
提交表单时,这是我的参数:
filled_cartridges_attributes"=>{"0"=>{"cartridge_name"=>"HP new 2",
"_destroy"=>"false",
"client_id"=>"",
"request_id"=>"",
"cartridge_id"=>""}}
注意像client_id这样的空参数,我想在保存之前在控制器中设置它们的值。
这就是我尝试这样做的方式:
# Iterate through nested params
params[:request][:filled_cartridges_attributes].each do |_,value|
# set param value,
value[:client_id] = @client.id
答案 0 :(得分:0)
使用地图更好!这个方法
http://ruby-doc.org/core-2.2.0/Array.html#method-i-map-21
params[:request][:filled_cartridges_attributes].map! do |val|
{
client_id: @client.id,
cartridge_name: val[:cartridge_name],
#code omitted
}
end
答案 1 :(得分:0)
尝试使用ActiveRecord回调:http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
class FilledCartridge
belongs_to :client
before_validation :set_client
def set_client
#set @client to the desired client
client = @client
end
end
因为我不知道你是如何在控制器中获得@client的,所以不能再进一步了。 您还可以设置client_id(不是最喜欢的方式)。
这个回调可以在任何其他级别执行(如果你想要持久性,那么在创建之前)。
具有多个属性:
class FilledCartridge
belongs_to :client
belongs_to :request
before_validation :set_attributes
def set_attributes
@client = Client.first #this should be changed
@request = Request.first #this should be changed too
client = @client
request = @request
end
end
答案 2 :(得分:0)
您可以在表单中使用隐藏字段并设置值。在这种情况下,不需要在控制器级别迭代和设置参数。
<%= hidden_field_tag 'client_id', @client.id %>
但是如果不想添加隐藏字段并且您只想跟踪client_id并且不想创建FilledCartridge的关联,则可以进行分配。
我认为隐藏的现场解决方案更好。