2010-11-23 106 views
1
unless @client.nil? 
    TestMailer.snap_shot_error("test1","Errors", 
     {:file_name => File.basename(upload_file),:client_name => @client.client_name}) 
else 
    TestMailer.snap_shot_error("test1","Errors", 
     {:file_name => File.basename(upload_file)) 
end 

def snap_shot_error(to_address,subject,options={}) 
    # code 
end 

<% if @client_name %> 
    <%= _("There were problems with file ") + @file_name + _(" for client ") + @client_name %> 
<% else %> 
    <%= _("There were problems with file ") + @file_name %> 
<% end %> 

回答

3

對於這兩個問題,您可以使用三元運算符。它的工作原理是這樣的

condition ? value_if_true : value_if_false 

這是一個表達式(產生另一個值的值和運算符序列)。它確定條件是真還是假,並且如果條件爲真,則評估爲第一值(在?之後和之前);如果條件爲真,則評估爲第二值(在:)之後)。

那麼,對於您發佈的第一個代碼示例,你可以這樣做:

TestMailer.snap_shot_error("test1", "Errors", 
    :file_name => File.basename(upload_file), 
    :client_name => @client ? @client.client_name : nil) 

[注意我已經刪除花括號周圍的選項 - 在Ruby中有沒有需要,在最終選擇亂碼,這是慣用離開他們關閉]

或者,如果由於某種原因,你甚至不想要一個零:CLIENT_NAME在哈希,您可以使用三元運算和合並:

TestMailer.snap_shot_error("test1", "Errors", 
    {:file_name => File.basename(upload_file)}.merge(
    @client ? { :client_name => @client.client_name } : {})) 

對於視圖,您還可以使用三元運算:

<%= _("There were problems with file ") + @file_name + 
    (@client_name ? _(" for client ") + @client_name : '') %> 

而現在,我看你是用@client_name做什麼,我不明白爲什麼你說你需要,它甚至不會在哈希值。我發佈的第一個代碼示例中,如果有客戶端,並且在沒有客戶端的情況下傳遞「:client_name => nil」,則它傳遞「:client_name => @ client.client_name」,應該可以正常工作。沒有理由不傳遞:client_name,而不是傳遞一個nil:client_name。

+0

我不想在選項中傳遞client_name鍵。如果@client不可用。 – 2010-11-23 18:52:32