2014-03-13 78 views
0

有人能解釋一下這個代碼背後的邏輯(這是順便說一句正確的代碼)如果,否則,動態語句邏輯

<% 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關於如何理解代碼的建議?

回答

3

你的直覺是正確的,但你需要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

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 
0

您可以通過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' –

0

的代碼檢查哈希鍵的存在,然後檢查哈希值是存在的。這個動作可以在一個檢查使用來完成:

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

當我嘗試此解決方案時出現以下錯誤:未定義的方法嘗試{「first_name」=> 「blah13」}:哈希 – user3408293

+0

那麼你沒有使用rails,爲什麼你將它添加到標籤? –

+0

你是什麼意思?我不明白你的問題。 – user3408293