2011-09-24 95 views
1

-double負*警告 - 新手提醒*軌道的可變

我讀了一本書叫RailsS​​pace學習Ruby on Rails框架。作者構建了用戶可以編輯的用戶配置文件,現在他正在基於其他用戶配置文件構建面向公衆的配置文件。他必須做出的唯一改變是基本上隱藏了面向公衆的配置文件中的編輯鏈接。他利用這個功能來隱藏它,但我不明白它是如何工作... hide_edit_links是一個變量

# Return true if hiding the edit links for spec, FAQ, etc. 

    def hide_edit_links? 

    not @hide_edit_links.nil? 

    end 

他還寫道

順便說一句,原因hide_edit_links?一般情況下, 實例變量如果未定義則爲零,因此函數返回 爲false,除非明確設置@ hide_edit_links。

但我真的不明白。

你可以在一個新手更詳細的解釋嗎?

他實現它後來與此

<div class="sidebar_box"> <h2> 
<% unless hide_edit_links? %> <span class="edit_link"> 
<%= link_to "(edit)", :controller => "faq", :action => "edit" %> </span> 
<% end %> 

回答

2

我認爲關鍵要明白,代碼(我沒有看過這本書)是@hide_edit_links不是一個布爾值,它只是某種標籤。如果@hide_edit_links不是nil(它與哪個對象類型無關),那麼hide_edit_links?`將返回true。

我不得不說的是,代碼是不是在所有直線前進,這絕對是令人費解的,複雜的(可能是沒有任何理由)

例1(新實例,不@hide_edit_links集,因此它顯示的鏈接) 。

  • 類被實例化(該代碼是不是在原來的問題,但我假定它的存在),並且由於不是參照@hide_edit_links,所述instace變量的值是nil
  • 當調用hide_edit_links?從頁@hide_edit_links是零,所以@hide_edit_links.nil?返回true,因此not @hide_edit_links.nil?是錯誤的。
  • 由於頁面使用unless hide_edit_links?,它顯示鏈接。

示例2(新實例,用@hide_edit_links設置一個對象,所以它不顯示鏈接)。

  • 該類被實例化並且@hide_edit_links被設置爲不是nil的值。
  • hide_edit_links?從頁面調用,@hide_edit_links爲零,所以@hide_edit_links.nil?返回false,從而not @hide_edit_links.nil?是真實的。
  • 由於頁面使用unless hide_edit_links?,因此不顯示鏈接。

對不起,關於微不足道的例子......「特徵」並不複雜,但作者使用的解決方案看起來非常複雜,我的愚蠢的大腦。

+0

這有助於很多。謝謝。 – Leahcim

+1

當我讀完這本書並且不得不同意的時候,我就細讀了這本書。這是很多不太好的實踐中的一個例子。再加上它有點過時了。你可能會更好地選擇新版本的「The Rails Way」或任何更新的書籍。 – numbers1311407

+0

只是爲了給我兩分錢:另一種雙重否定的語法是'!! @ variable'。 「雄辯的紅寶石」這本書有一個非常明確的解釋。 Ruby在布爾上下文中工作,但很少使用真正的布爾值。這與Ruby的哲學是一致的:所有的都是一個對象,除了false和nil以外的任何對象都將被評估爲true。因此,除非這個@hide_edit_links預計會在某一時刻明確地變爲假,否則幾乎毫無意義地產生這樣一個令人費解的代碼。我真的推薦閱讀這本書,這對我理解ruby成語的部分有很大的幫助。 –