#{} 样式的替换在 ERB 表达式中有效吗?

Does #{}-style substitution work in ERB expressions?

我在 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}”对我有用?有什么区别?

试试这个,看看" "' '

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

#{} 不起作用的原因是双引号 " 和单引号 '

之间的区别

编辑:有关字符串插值和使用 #{} 样式的更完整描述,请阅读 this question. to see why double-quotes vs. single quotes don't normally pose a meaningful performance issue, 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}"?)

(你可以在上面的link中看到更多关于插值的选项)

祝你好运!