很抱歉,我甚至不确定如何提出这个问题..所以,如果您也可以提出建议,我们将不胜感激。
# A. WORKS, but "stockroom" is hardcoded
render partial: association.to_s.singularize + '',
locals: {stockroom: new_object}
# B. WORKS, but uses old syntax
render partial: association.to_s.singularize + '',
locals: {association.to_s.singularize.to_sym => new_object}
# C. does NOT work
render partial: association.to_s.singularize + '',
locals: {association.to_s.singularize.to_sym: new_object}
# D. does NOT work
ass = association.to_s.singularize.to_sym
logger.debug "--- ass: #{ass.inspect} (#{ass.class})"
# => --- ass: :stockroom (Symbol)
render partial: association.to_s.singularize + '', locals: {ass: new_object}
并不是说旧语法是坏事,我只是想知道是否有办法使用新语法(即使是通过中介(即屁股))。
答案 0 :(得分:9)
JavaScript样式语法实际上不是 new 语法,它只是1.9中的 alternate 语法,可以用于 Hash文字中的一些符号文字。
你不能对所有符号使用尾部冒号样式,试试这些,你会看到:
{ :$set => 11 } # Valid
{ $set: 11 } # Invalid
{ :'where.is.pancakes.house?' => 23 } # Valid
{ 'where.is.pancakes.house?': 23 } # Invalid
同样,如果您的符号不是符号文字:
s = o.to_sym; { s => 42 }
{ o.to_sym => 42 }
然后你必须在Hashes中使用胖箭头语法。如果您的密钥不是符号,则同样适用:
a = %w{where is pancakes house?}
h = { a => 11 }
g = { a: 11 } # Also works but produces a completely different result!
总之,尾随冒号转换一些文字值(我认为匹配/\A[a-z_]\w*\z/i
但我不确定的任何内容)在Hash文字中使用时会在符号前面加上符号。基本上,JavaScript风格在除了最微不足道的情况之外都是无用的;但是琐碎的案件恰好是最常见的。
我能想到将JavaScript样式与非文字符号一起使用的唯一方法就是这样的憎恶:
ass = association.to_s.singularize.to_sym
h = eval "{ #{ass}: 'pancakes' }"
如果你曾经在真实的代码中加入类似的东西,那么神可以怜悯你的灵魂。
另外,请记住,当您想要访问哈希时,必须使用符号的前导冒号形式:
h[:pancakes] # Valid
h[pancakes:] # Invalid
因此JavaScript样式的实用性有限。