如何在Rails 4中从控制器设置循环内的参数?

时间:2015-04-24 11:04:36

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

大家好我想从控制器设置参数。 我有嵌套的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
允许这样做吗? 我还需要从控制器设置的那些参数的隐藏字段。

3 个答案:

答案 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的关联,则可以进行分配。

我认为隐藏的现场解决方案更好。