【问题标题】:Does #{}-style substitution work in ERB expressions? [duplicate]#{} 样式的替换是否适用于 ERB 表达式? [复制]
【发布时间】:2015-04-23 04:37:12
【问题描述】:

我在我的 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}”更易读?有什么区别?

【问题讨论】:

  • 另一个问题(投票关闭作为重复)更容易在谷歌上找到并且有一个非常有用的答案。
  • 可能是重复的,但我相信这个讨论可能对未来的 ruby​​-ists 有所帮助。该问题与带有#{} 插值的双引号与单引号的具体问题有关(另一个仅提到传递的差异)。也许应该编辑问题/答案,使他们更专注于这个特定问题(主题可能是:“为什么#{} 不起作用”或类似的)。
  • 关闭不等于删除。这只是意味着这里不需要更多的答案。我认为您的回答涵盖了这个问题所需的一切。

标签: ruby erb


【解决方案1】:

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

编辑:有关字符串插值和使用#{} 样式的更完整描述,请阅读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}"?)

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

祝你好运!

【讨论】:

  • 啊哈。我显然已经离开 Ruby 太久了,我忘记了。我一直在寻找一个重复的规范问题;到目前为止,我已经找到了六个 0-upvote 和 1-upvote 等价物,但没有什么特别突出的......似乎应该有一个规范的问题......
  • 您也可以使用%Q(...) 文字来避免转义:confirm: %Q(Really delete blog "#{article.title}"?)
  • 感谢@PaulHicks 澄清这一点。我不知道有什么区别。并感谢@提供更清洁的选择。我会用提示编辑答案。
【解决方案2】:

试试这个方法,看看" "' '

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

【讨论】:

    猜你喜欢
    • 2020-06-21
    • 1970-01-01
    • 2014-04-14
    • 2022-11-28
    • 2020-05-22
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多