1

我在控制器中有以下代码,我想知道将其重构为一体的最佳方法。

if @country
    if s.address
        s.address.country = @country
    else
        s.address = Address.create(:country => @country)
    end
end

if @state
    if s.address
        s.address.state = @state
    else
        s.address = Address.create(:state => @state)
    end
end

if @zip
    if s.address
        s.address.zip = @zip
    else
        s.address = Address.create(:zip => @zip)
    end
end

如果这里有一种变化,我会做类似的事情

    [:country, :state, :zip].each do |location|
        ...
    end

但在这种情况下,我使用的是 :country、.country 和 @country; 有什么更好的方法来利用它们具有相同的“根”字符串?谢谢!

4

2 回答 2

3
[:country, :state, :zip].each do |e|
  if v = instance_variable_get("@#{e}")
    if s.address
      s.address.send(e) = v
    else
      s.address = Address.create(e => v)
    end
  end
end
于 2013-07-11T02:49:09.970 回答
1

我会推荐:

  1. 遵循瘦控制器,胖模型最佳实践并从控制器中删除所有业务逻辑。
  2. 使用有意义的变量名。你s的例子是什么?如果学生 - 为什么不打电话呢student

假设countyandstate是文本值而不是关联字段,我会将您的代码更改为以下内容:

在控制器中:

student.create_or_update_address(county: @county, state: @state, zip: @zip)

在 student.rb(或其他模型,如果s不是学生)

def create_or_update_address(options)
  address_attributes = options.delete_if { |k, v| v.empty? }

  if address
    address.update_attributes(address_attributes)
  else
    s.address = Address.create(address_attributes)
  end
end 
于 2013-07-11T07:48:05.200 回答