Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails在我的纯文本邮件中转义HTML_Ruby On Rails_Ruby_Ruby On Rails 3_Actionmailer_Erb - Fatal编程技术网

Ruby on rails Rails在我的纯文本邮件中转义HTML

Ruby on rails Rails在我的纯文本邮件中转义HTML,ruby-on-rails,ruby,ruby-on-rails-3,actionmailer,erb,Ruby On Rails,Ruby,Ruby On Rails 3,Actionmailer,Erb,我正在使用rails 3.2.5ActionMailer发送纯文本邮件。如果我有这样的邮件视图: 来自用户.text.erb的消息: 你好, 您从中收到以下消息: 当@message为“引号和符号”时,纯文本邮件包含“引号和符号”。因此,rails似乎只是将其视为HTML视图,并转义任何HTML以防止跨站点脚本编写。然而,这是一封纯文本邮件。扩展名是.text.erb和ActionMailer检测到这一点,并将MIME设置为text/plain。所以我永远不想逃避其中的任何html 我的应用程

我正在使用rails 3.2.5
ActionMailer
发送纯文本邮件。如果我有这样的邮件视图:

来自用户.text.erb的消息
你好,
您从中收到以下消息:
@message
“引号和符号”
时,纯文本邮件包含
“引号和符号”
。因此,rails似乎只是将其视为HTML视图,并转义任何HTML以防止跨站点脚本编写。然而,这是一封纯文本邮件。扩展名是
.text.erb
ActionMailer
检测到这一点,并将MIME设置为
text/plain
。所以我永远不想逃避其中的任何html

我的应用程序中有很多邮件模板,它们都是纯文本。我会考虑修补它们,包括<代码> <代码>或<代码> <代码>坏样式-不是非常干。< /P> 我尝试了各种各样的解决办法,其中包括资金修补Erubis。它们似乎都不起作用。我正在寻找一些补丁或配置选项或任何东西来禁用所有
.text.erb
文件的转义html

非常感谢您的帮助

试试看

<%= @message.html_safe %>

如果您使用了搜索功能,就会找到这个答案。如果这不符合你的需要,也许可以检查一下


如果您还没有看到,这里讨论了一些选项

在通过Erubis代码调试了几个小时后,我发现了以下修复方法。您只需将其放入
config/initializers/fix_my_mails.rb
。我已经用rails 3.2.7对此进行了测试。它可能适用于其他版本

module ActionView
  class Template
    module Handlers
      class ERB
        def call(template)
          if template.source.encoding_aware?
            # First, convert to BINARY, so in case the encoding is
            # wrong, we can still find an encoding tag
            # (<%# encoding %>) inside the String using a regular
            # expression
            template_source = template.source.dup.force_encoding("BINARY")

            erb = template_source.gsub(ENCODING_TAG, '')
            encoding = $2

            erb.force_encoding valid_encoding(template.source.dup, encoding)

            # Always make sure we return a String in the default_internal
            erb.encode!
          else
            erb = template.source.dup
          end

          self.class.erb_implementation.new(
            erb,
            :trim => (self.class.erb_trim_mode == "-"),
            :escape => template.identifier =~ /\.text/ # only escape HTML templates
          ).src
        end
      end
    end
  end
end
模块操作视图
类模板
模块处理程序
雇员再培训局
def调用(模板)
如果template.source.encoding不知道?
#首先,将其转换为二进制,以便
#错了,我们仍然可以找到编码标签
#()使用常规
#表情
template\u source=template.source.dup.force\u编码(“二进制”)
erb=模板\源.gsub(编码\标记“”)
编码=$2
erb.force_编码有效_编码(template.source.dup,encoding)
#始终确保在默认的\u internal中返回字符串
erb.encode!
其他的
erb=template.source.dup
结束
self.class.erb_implementation.new(
雇员再培训局,
:trim=>(self.class.erb\u trim\u mode==“-”,
:escape=>template.identifier=~/\.text/#仅转义HTML模板
).src
结束
结束
结束
结束
结束

它只是在文件名中包含
.text
的每个erb文件中禁用HTML实体

谢谢你的回答,但如问题中所述,这不是我的选择。“…………我会考虑把所有的字体都贴在不好的字体上,而不是很干。”抱歉,吃东西和看书的效果似乎不像我想象的那么好。我添加了一个附加的likn,其中对这个问题进行了更深入的讨论。如果你还没读过,也许会有帮助
module ActionView
  class Template
    module Handlers
      class ERB
        def call(template)
          if template.source.encoding_aware?
            # First, convert to BINARY, so in case the encoding is
            # wrong, we can still find an encoding tag
            # (<%# encoding %>) inside the String using a regular
            # expression
            template_source = template.source.dup.force_encoding("BINARY")

            erb = template_source.gsub(ENCODING_TAG, '')
            encoding = $2

            erb.force_encoding valid_encoding(template.source.dup, encoding)

            # Always make sure we return a String in the default_internal
            erb.encode!
          else
            erb = template.source.dup
          end

          self.class.erb_implementation.new(
            erb,
            :trim => (self.class.erb_trim_mode == "-"),
            :escape => template.identifier =~ /\.text/ # only escape HTML templates
          ).src
        end
      end
    end
  end
end