有人可以解释这段代码背后的逻辑吗?(这是正确的代码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 *”
第一块代码对我来说不直观,第二块代码会更有意义..有关如何理解代码的建议吗?
答案 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?