将 ruby 插值嵌入到 html 字符串(变量)的 <script> 标签中?

Embed ruby interpolation into <script> tag of html string (variable)?

我正在努力将 ruby 插值嵌入到作为 html 字符串的字符串变量中。我想这听起来有点混乱,我希望代码能帮助理解:

  def devise_error_messages!
    return '' if resource.errors.empty?
    messages = resource.errors.full_messages
    html = <<-HTML
      <script type='text/javascript'>
        toastr.options = {
          'closeButton': true,
          'debug': false,
          'newestOnTop': false,
          'progressBar': false,
          'positionClass': 'toast-bottom-left',
          'preventDuplicates': true,
          'onclick': null,
          'showDuration': '3000',
          'hideDuration': '1000',
          'timeOut': '5000',
          'extendedTimeOut': '1000',
          'showEasing': 'swing',
          'hideEasing': 'linear',
          'showMethod': 'fadeIn',
          'hideMethod': 'fadeOut'
        }
        #{ messages.each do |m| }
          toastr['error']("#{m}");
        #{end}

      </script>
    HTML

    html.html_safe
  end

因此,如您所见,我正在尝试遍历 messages 数组并为每条消息生成这行 js 代码:toastr['error']("#{m}");

你能帮我正确实施吗?

您可以将 each 块移到 HTML 标签之外,并将结果简单地存储在一个字符串中,然后将该字符串附加到脚本标签中。

str = ""
messages.each do |m|    
  str += "toastr['error'](" + '"' + m + '"' + '); '
end

str 变量放在您想要的块中。

toastr.options = {
  ...
}
#{str}
...