#{} - 样式替换是否在ERB表达式中起作用?

时间:2015-04-23 04:37:12

标签: ruby erb

我正在我的rails教程中为删除操作添加一个确认对话框,我想要包含要删除的对象中的一些文本。所以我尝试了这个:

<%= link_to 'Delete', article_path(article), method: :delete, data: { confirm: 'Really delete blog "#{article.title}"?' } %>

替换不会发生:结果对话框显示Really delete blog "#{article.title}"?

我已将其更改为使用格式字符串,并且工作正常:

<%= link_to 'Delete', article_path(article), method: :delete, data: { confirm: 'Really delete blog "%s"?' % article.title } %>

替换发生:结果对话框显示Really delete blog "Of cabbages and kings"?

我如何更改以使更具可读性的“#{article.title}”为我工作?有什么区别?

2 个答案:

答案 0 :(得分:4)

#{}无效的原因是双引号"和单引号'之间的区别

编辑:有关字符串插值的更完整说明并使用#{}样式,请阅读this question。看看为什么双引号与单引号通常不会造成有意义的性能问题,read here。 - 感谢@PaulHicks进行此编辑。

单引号中的文本未经预处理(在创建String对象之前解析),而双引号中的文本已预处理。那样:

'hello\n "world"!' == "hello\\n \"world\"!" #=> true

以下更改可以正常工作(请注意双引号而不是单引号):

<%= link_to ... confirm: "Really delete blog \"#{article.title}\"?" } %>

编辑:正如@Stefan建议的那样,您也可以使用%Q()表示法来避免转义:

confirm: %Q(Really delete blog "#{article.title}"?)

(您可以在上面的链接中看到更多关于插值的选项)

祝你好运!

答案 1 :(得分:2)

尝试这种方式,请查看" "' '

"Really delete blog '#{article.title}'?"