重构DRYness的控制器代码

Gav*_*Gav 2 ruby-on-rails dry

在我的控制器的创建和更新操作中,我有很多这样的语句:

@company.set_preference(:api_username, params[:company]['api_username']) if params[:company]['api_username']
@company.set_preference(:api_password, params[:company]['api_password']) if params[:company]['api_password']
Run Code Online (Sandbox Code Playgroud)

我想知道如何重构这些以使我的代码更干燥.我敏锐地意识到他们可能属于模型(re:脂肪模型和瘦的控制器),但我不知道该怎么做.有人可以开导我吗?

在此先感谢您的时间,

GAV

mik*_*kej 8

这是@company.set_preference你试图避免的重复吗?还是重复params[:company]..

如何为您的Company模型添加方法,如:

def update_preferences(prefs)
  prefs.each_pair do |pref_name, value|
    set_preference(pref_name.to_sym, value)
  end
end
Run Code Online (Sandbox Code Playgroud)

然后用它来调用它

@company.update_preferences(params[:company])
Run Code Online (Sandbox Code Playgroud)

您还可以添加检查以确保仅设置有效的首选项,例如

VALID_PREFERENCES = ['api_username', 'api_password']

def update_preferences(prefs)
  prefs.each_pair do |pref_name, value|
    set_preference(pref_name.to_sym, value) if VALID_PREFERENCES.include?(pref_name)
  end
end
Run Code Online (Sandbox Code Playgroud)