参数的元编程

时间:2012-07-21 17:45:14

标签: ruby-on-rails params

如何以较简洁的方式更新这些非常相似的文本字段?下面的文本字段被命名为给定 - 我没有为此问题编辑它们。

  def update
    company = Company.find(current_user.client_id)
    company.text11 = params[:content][:text11][:value]
    company.text12 = params[:content][:text12][:value]
    company.text13 = params[:content][:text13][:value]
# etc
    company.save!
    render text: ""
  end

我已尝试使用sendto_sym但到目前为止没有运气......

2 个答案:

答案 0 :(得分:3)

[:text11, :text12, :text13].each do |s|
    company.send("#{s}=".to_sym, params[:content][s][:value])
end

如果它们都是增量数字,那么:

11.upto(13).map{|n| "text#{n}".to_sym}.each do |s|
    company.send("#{s}=".to_sym, params[:content][s][:value])
end

答案 1 :(得分:0)

我会考虑先清理参数,然后再动态分配属性。使用params的包装类可以让您更轻松地对此代码进行单元测试。也许这有助于你入门。

require 'ostruct'

class CompanyParamsWrapper

  attr_accessor :text11, :text12, :text13

  def initialize(params)
    @content = params[:content]
    content_struct = OpenStruct.new(@content)
    self.text11 = content_struct.text11[:value]
    self.text12 = content_struct.text12[:value]
    self.text13 = content_struct.text13[:value]
  end
end

# Company model
wrapper = CompanyParamsWrapper.new(params)
company.text11 = wrapper.text11

# now easier to use Object#send or other dynamic looping