2015-06-21 60 views
1

知道這是可能的紅寶石:爲什麼在使用路由輔助方法時必須使用括號?

method_name param, other_method other_param 

這將是另一種編程語言相當於:

method_name(param, other_method(other_param)) 

爲什麼它是可能做到這一點與自動生成的路由幫助程序,這些方法與其他方法一樣嗎?

例如:

<%= link_to ticket.subject, ticket_path(ticket.id) %> 

是有效的 - 它返回,例如,<a href="/tickets/1">Lorem ipsum.</a>,但:

<%= link_to ticket.subject, ticket_path ticket.id %> 

是不是 - 它返回一個unexpected tIDENTIFIER錯誤。

+2

你肯定'METHOD_NAME PARAM,other_method other_param'作品如預期? 'f g x'是'f(g(x))',但是'f 6,g x'是一個SyntaxError。 –

回答

3

method_name param, other_method other_param在Ruby中是不可能的,所以對於路由幫助程序來說這是不可能的,因爲它是不明確的。

在Matz的The Ruby Programming Language中甚至有關於此的section

例子:

irb(main):001:0> def link_to(a, b) 
irb(main):002:1> puts a, b 
irb(main):003:1> end 
:link_to 
irb(main):004:0> def foo(a) 
irb(main):005:1> puts 'foo' 
irb(main):006:1> end 
:foo 
irb(main):007:0> link_to 'hello', foo 'abc' 
SyntaxError: (irb):7: syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' 
link_to 'hello', foo 'abc' 
        ^
    from /usr/local/var/rbenv/versions/2.2.2/bin/irb:11:in `<main>' 
irb(main):008:0> link_to 'hello', foo('abc') 
foo 
hello 

nil 
+1

不僅您的答案簡潔明瞭,而且Matz書中的章節清晰可見。感謝堆! – AeroCross

相關問題