如果,否则动态语句逻辑

时间:2014-03-13 23:26:46

标签: ruby-on-rails ruby

有人可以解释这段代码背后的逻辑吗?(这是正确的代码btw)

<% if @request.query['first_name'] && !@request.query['first_name'].empty? %>
    Welcome! <%= @request.query['first_name'] %>
  <% else %>
    Hi! What is your name?
<% end %>

我的直觉是写下以下内容:

<% if @request.query.inspect['first_name'].empty? %> 
    Hi! What is your name? 
  <% else %> 
    Welcome! <%= @request.query.inspect['first_name'] %>
<% end %>

我正在尝试建立一个用户可以输入姓名的用户表单,当没有输入时,表单上方的文字显示“嗨!你叫什么名字?”当有输入时,它会显示一条消息“Welcome!* User_name *”

第一块代码对我来说不直观,第二块代码会更有意义..有关如何理解代码的建议吗?

4 个答案:

答案 0 :(得分:3)

你的直觉是正确的,尽管你需要替代empty?。 Rails添加了一些您可以使用的不同方法:

如果接收者是blank?,空数组,字符串或散列,或只有空格的字符串,则

nil返回true。

如果present?为false,则

blank?返回true。所以你的情况可能是:

<% if @request.query['first_name'].present? %>
  Welcome...

(我发现从积极的条件开始总是更直观 - 检查blank?)也可以。

编辑:如果你想要的是字符串或nil,你很可能完全跳过查询方法。只需使用:

<% if @request.query['first_name'] %>

答案 1 :(得分:0)

您需要检查它是否为零,然后才能检查它是否为空,因为您正在查看Hash#empty?

irb(main):001:0> nil.empty?
NoMethodError: undefined method `empty?' for nil:NilClass
    from (irb):1
irb(main):002:0> {}.empty?
=> true

答案 2 :(得分:0)

您可以通过将nil转换为空字符串来避免if语句中的第一个条件。我不知道这是不是你的意思,但你几乎已经有了。

首先,你不应该在哈希中调用inspect,因为它会将整个事物变成一个复杂的&#39;串。你想要做什么只转动first_name选项中的值,因为在这种情况下,如果名称存在,它仍然是相同的,如果它没有,它将变成{{1 }}

其次,方法"nil"不是这里的最佳选择,因为返回的字符串永远不会为空,因为inspect。你应该使用的方法是nil.inspect => "nil",当应用于nil:to_s时,它会表现得像这样。

最后,您可以将代码更新为:

nil.to_s => ""

答案 3 :(得分:0)

代码检查哈希密钥是否存在,然后检查是否存在哈希值。可以使用以下方法在一次检查中完成此操作:

@request.query.try(:[], 'first_name').empty?