2014-06-17 49 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

你能回答我上面的問題,詢問「設置」是什麼?謝謝 –

相關問題