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 %>
答案 0 :(得分:3)
对于这两个questoin,您可以使用三元运算符。它像这样工作
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中,最终选项哈希没有必要,并且将它们关闭是惯用的]
或者,如果由于某种原因你甚至不想在哈希中使用nil: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 =&gt; @ client.client_name”并且如果没有客户端则传递“:client_name =&gt; nil”,应该可以正常工作。没有理由不传递:client_name而不是传递一个nil:client_name。