2011-09-24 52 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成语的部分有很大的帮助。 –