为什么这在Ruby 1.9.3下工作而不在1.8.7下?

时间:2012-01-11 18:28:31

标签: ruby-on-rails ruby

我正在Rails中构建一个自定义的表单生成器,我一直在关注这个优秀的Rails Cast视频(http://railscasts.com/episodes/311-form-builders?view=asciicast)。

Ryan使用这样的一行:

<%= form_for @project, builder: BootstrapFormBuilder do |f| %>

但是在1.8.7之下,这会出现一个含糊不清的错误消息。

Ruby 1.9.3中发生了什么变化,使其现在有效?

顺便说一句,以下 在1.8.7中工作,但为什么呢?

<%= form_for(@project, :builder => BootstrapFormBuilder) do |f| %>

5 个答案:

答案 0 :(得分:5)

  

Ruby 1.9.3中发生了什么变化,使其现在有效?

Hash文字有一种新语法,其密钥为Symbol,是有效的标识符。而不是

{ :foo => 'bar', :baz => 42 }

您现在也可以写

{ foo: 'bar', baz: 42 }

此语法在1.9.0中引入。

  

顺便说一句,以下内容在1.8.7中有效,但为什么呢?

因为这是相同的事情,只是使用不同的语法编写。

答案 1 :(得分:2)

哈希语法已扩展为允许用户使用类似JavaScript的样式。

# Old syntax
old_hash = { :name => 'Ruby', :influences => ['Perl', 'Python', 'Smalltalk'] }

# New syntax (Ruby 1.9 only)
new_hash = { name: 'Ruby', influences: ['Perl', 'Python', 'Smalltalk'] }

http://peepcode.com/blog/2011/rip-ruby-hash-rocket-syntax

答案 2 :(得分:1)

Ruby 1.9中的哈希语法已更改。在所有版本的Ruby中,您都可以使用key => value,但Ruby 1.9具有新的key: value语法。这就是你的第二个例子有效的原因,但第一个例子没有。

答案 3 :(得分:1)

由于这一部分:

builder: BootstrapFormBuilder

这会创建一个哈希,但语法只允许在Ruby 1.9+中使用。之前,要创建哈希,您必须执行

:builder => BootstrapFormBuilder

这就是第二行在1.8中工作的原因。

答案 4 :(得分:1)

Ruby 1.9引入了另一种哈希语法:

# Ruby 1.8 and 1.9
h = { :a => 1, :b => 2 }

# Ruby 1.9 only
h = { a: 1, b: 2 }

应该注意a:只是:a =>的语法糖,即a仍然是符号。

相关问题