Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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_Templates_Actionmailer_Dry - Fatal编程技术网

Ruby on rails Rails和多部分电子邮件,具有用户定义的部分选择和html到文本的自动转换

Ruby on rails Rails和多部分电子邮件,具有用户定义的部分选择和html到文本的自动转换,ruby-on-rails,templates,actionmailer,dry,Ruby On Rails,Templates,Actionmailer,Dry,我们的Rails(3.0.14)应用程序具有用户配置文件,用户可以选择是否接收HTML格式的电子邮件。为了保持干爽,我只想为所有邮件(HTML)设置一组模板,然后在文本/普通部分使用我自己的字符串扩展名dehtml(基本上是strip_标签,并进行一些格式修改)。此外,我想保持邮件代码干燥 到目前为止,我们的mailer方法如下所示: def signup_confirmation(user) @user = user mail(:to => @user.email, :subje

我们的Rails(3.0.14)应用程序具有用户配置文件,用户可以选择是否接收HTML格式的电子邮件。为了保持干爽,我只想为所有邮件(HTML)设置一组模板,然后在文本/普通部分使用我自己的字符串扩展名
dehtml
(基本上是
strip_标签
,并进行一些格式修改)。此外,我想保持邮件代码干燥

到目前为止,我们的mailer方法如下所示:

def signup_confirmation(user)
  @user = user
  mail(:to => @user.email, :subject => ..., ...)
end
1。干式模板:如果可能,我希望避免创建200个额外的邮件模板,并从HTML模板自动创建文本/普通部分。这是基本思想(
dehtml
是我自己的字符串扩展):

但是,此操作失败,出现“缺少模板”错误。我如何告诉Rails在这两种情况下都使用HTML模板?我尝试添加
:formats=>:html
:handler=>:html
,但这没有帮助

我现在没有解决办法。有什么想法吗

2:干邮件发送方法: 因为我们的用户应该能够决定他们是否想要HTML,上面的方法看起来像

def signup_confirmation(user)
  @user = user
  attachments.inline["email-header.jpg"] = File.read(...) if @user.wants_html
  mail(:to => @user.email, :subject => ..., ...) do |format|
    format.html if @user.wants_html
    format.text { render(:file => 'signup_notification.html').dehtml }
  end
end
总之,这将使每个方法中的LOC增加三倍。我想尽可能地把它弄干(因为它必须被插入至少200个mailer方法中)。一个想法是编写我自己的
mail
方法(我们称之为
mymail
),如下所示

def mymail(user, p={})
  attachments.inline["email-header.jpg"] = File.read(...) if user.wants_html
  mail(p) do |format|
    format.html if user.wants_html
    format.text
  end
end
(暂时忽略上面的文本模板问题),然后将每个调用更改为
mail
mymail
,如中所示

def signup_confirmation(user)
  @user = user
  attachments.inline["email-header.jpg"] = File.read(...) if @user.wants_html
  mymail(user, { :to => @user.email, :subject => ..., ... })
end
这很有效。但这是一种良好的做法吗?我最好将
mymail
-放在助手中的什么位置


欢迎有任何见解和建议

很久以前,我做了一件与您的第一个解决方案非常相似的事情。我真的不记得为什么会这样,但这对我来说很有用:

def my_mail
  mail(:to => @user.email ...) do |format|
    format.text { convert_html_to_plain(__method__) } # first text
    format.html                                       # then html
  end
end

def convert_html_to_plain(method)
  old_formats = self.formats
  self.formats = ["html"]
  rendered = render "#{method}", :layout => false
  self.formats = old_formats

  # strip tags, reformat, etc. from rendered
  rendered << render(:partial => "plaintext_footer", :locals => {:user => @user}, :formats => [:text] )
end
def我的邮件
邮件(:to=>@user.email…)执行|格式|
format.text{convert_html_to_plain(_method__)}第一个文本
format.html#然后是html
结束
结束
def将html转换为普通格式(方法)
旧格式=self.formats
self.formats=[“html”]
rendered=render“#{method}”,布局=>false
self.formats=旧格式
#从渲染图像中剥离标记、重新格式化等
呈现的“纯文本”,:locals=>{:user=>@user},:formats=>[:text])
结束

很久以前,我做了一件与您的第一个解决方案非常相似的事情。我真的不记得为什么会这样,但这对我来说很有用:

def my_mail
  mail(:to => @user.email ...) do |format|
    format.text { convert_html_to_plain(__method__) } # first text
    format.html                                       # then html
  end
end

def convert_html_to_plain(method)
  old_formats = self.formats
  self.formats = ["html"]
  rendered = render "#{method}", :layout => false
  self.formats = old_formats

  # strip tags, reformat, etc. from rendered
  rendered << render(:partial => "plaintext_footer", :locals => {:user => @user}, :formats => [:text] )
end
def我的邮件
邮件(:to=>@user.email…)执行|格式|
format.text{convert_html_to_plain(_method__)}第一个文本
format.html#然后是html
结束
结束
def将html转换为普通格式(方法)
旧格式=self.formats
self.formats=[“html”]
rendered=render“#{method}”,布局=>false
self.formats=旧格式
#从渲染图像中剥离标记、重新格式化等
呈现的“纯文本”,:locals=>{:user=>@user},:formats=>[:text])
结束

这似乎有些效果,但是我的实例变量不会传播到纯文本“render”调用(例如“@url”)。有没有办法用干燥的方式来做这件事?我的mailer方法有时有相当多的实例变量集,它们在mailer模板中使用。谢谢已解决-我忘记返回“已渲染”。现在我把convert方法直接放在
format.text
块中,它似乎工作得很好。另请参见。这似乎有些效果,但是我的实例变量不会传播到纯文本“render”调用(例如“@url”)。有没有办法用干燥的方式来做这件事?我的mailer方法有时有相当多的实例变量集,它们在mailer模板中使用。谢谢已解决-我忘记返回“已渲染”。现在我把convert方法直接放在
format.text
块中,它似乎工作得很好。另见。