2014-06-17 44 views
0

我有一个“选项”列表。我需要评估每个选项并将其设置为真或假。将字符串转换为符号并在if语句中使用

于是我开始与

if params[:account][:use_dbs].present? 
     if params[:account][:use_dbs] == '1' 
     @account.settings.use_dbs = true 
     else 
     @account.settings.use_dbs = false 
     end 
    end 

    if params[:account][:use_time_logs].present? 
     if params[:account][:use_time_logs] == '1' 
     @account.settings.use_time_logs = true 
     else 
     @account.settings.use_time_logs = false 
     end 
    end 

这实际上工作得很好。不过,我最终会选择20个左右的选项,我不想重复20次。所以然后我想到做这样的事情...

# handle optional screen settings 
    options = ['use_dbs', 'use_time_logs'] 
    options.each do |option| 
     if params[:account][(option.to_sym)] == '1' 
     @account.settings.option.to_sym = true 
     else 
     @account.settings.option.to_sym = false 
     end 
    end 

这显然会很多整洁,但我不能让我的头围绕所需的语法。有人可以帮忙吗?

+0

什么是@ account.settings?即什么类型的对象? –

+1

如果'@ account'是一个活动的记录对象,'use_dbs'和'use_time_logs'是位列,那么您可以直接指定它们,而rails将处理类型转换:'@ account.assign_attributes(params [:account])' – BroiSatse

回答

2

你几乎没有!我认为给你带来麻烦的是如何动态调用方法(即你的@account.settings.use_time_logs=调用)。你可以使用send来做到这一点。请注意,您需要在属性名称末尾添加一个=(当您做object.attr=时,实际上您正在调用名为attr=的方法object)。

由于@Stefan指出的那样,你可以直接把布尔条件作为一个值,你的生活也将通过利用字符串而不是符号(为什么用to_sym麻烦所有的时间?)

做了很多更容易

所以:

# handle optional screen settings 
options = [:use_dbs, :use_time_logs] 
options.each do |option| 
    @account.settings.send("#{option}=", params[:account][option] == '1') 
end 
+0

这是一种享受,谢谢! –

+0

@Gareth。如果它解决了你的问题,你应该接受这个答案。 – user2503775

0

那么首先要说的是“为什么不首先使用符号?”

options = [:use_dbs, :use_time_logs] 
options.each do |option| 
    if params[:account][option] == '1' 
    @account.settings.option = true 
    else 
    @account.settings.option = false 
    end 
end 

其次,这是不太一样的你的第一次:第一个代码,如果该选项不存在params中你不将它设置为任何东西。在第二批代码中,您将其设置为false。我不知道这是否重要。

我认为这实际上可以做它像这样被进一步收拾:

if params[:account] 
    params[:account].each do |k,v| 
    @account.settings.send("#{k}=", v == "1") 
    end 
end 
+0

使用第一组代码我为#“得到一个错误”undefined method'option ='。如果我将@ account.settings.use_dbs = true设置为有效,但@ account.settings.option = true不会。你能想到一个明显的原因,为什么? –

+0

你能回答我上面的问题,询问“设置”是什么?谢谢 –

相关问题