如果,否则,动态语句逻辑

如果,否则,动态语句逻辑

问题描述:

有人能解释一下这个代码背后的逻辑(这是顺便说一句正确的代码)如果,否则,动态语句逻辑

<% if @request.query['first_name'] && [email protected]['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 *”

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

你的直觉是正确的,但你需要empty?替代。 Rails添加了以下几种不同的方法供您使用:

blank?如果接收方是nil,一个空数组,字符串或散列或只有空白的字符串,则返回true。

present?如果blank?为假,则返回true。所以,你的情况可能是:

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

(我发现它总是更直观开始与积极条件 - 这将很好的工作,以检查blank?)。

编辑:这很可能是你可以完全跳过查询方法,如果你希望有一个字符串或nil。只需使用:

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

我不会建议使用'if @ request.query ['first_name']'因为不等于第一个代码,因为空字符串会通过这个条件并且可能会导致意外的结果 –

+0

@RafaelRamosBravin,你是对的。实施取决于代码库的测试程度。 –

+0

使用.present?不管用。我得到一个错误,但做@ request.query ['first_name']工作,任何人都知道为什么.present?可能无法工作?我收到以下错误消息:未定义的方法'存在?'为“blah13”:WEBrick :: HTTPUtils :: FormData – user3408293

你需要检查它是否是零,然后才可以,如果其空检查,因为你检查Hash#empty?

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

您可以通过transforimng零到一个空字符串避免if语句中的第一个条件。我不知道你是否打算这样做,但你几乎没有。

首先,您不应该在哈希中调用inspect,因为它会将整个事物转换为“复杂”字符串。你想要做的只是在first_name选项里面的值,因为在这种情况下,如果名字存在,它仍然是相同的,如果不存在,它将变成"nil"

其次,方法inspect不是这里的最佳选择,因为返回的字符串永远不会是空的,因为nil.inspect => "nil"。你应该使用的方法是to_s,如果适用于零:nil.to_s => "",它的行为将如此。

最后,你可以更新您的代码:

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

'查询。inspect [“first_name”]'会返回字符串'“first_name”'或'nil'。 –

+0

你是对的,我忘了删除'inspect'方法 –

+0

@ZachKemp我没有意识到他现在正在调用'inspect'查看整个哈希。这很奇怪,因为它永远不会达到'first_name'的值,我想他的意思是使用'query [“first_name”]。inspect' –

的代码检查哈希键的存在,然后检查哈希值是存在的。这个动作可以在一个检查使用来完成:

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

当我尝试此解决方案时出现以下错误:未定义的方法尝试{“first_name”=> “blah13”}:哈希 – user3408293

+0

那么你没有使用rails,为什么你将它添加到标签? –

+0

你是什么意思?我不明白你的问题。 – user3408293