正确的方法来写这个条件

时间:2010-11-23 18:43:22

标签: ruby-on-rails ruby

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 %>

1 个答案:

答案 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。