ActionMailer是Rails中发送email的一个controller。今天遇到的一个问题就是在ActionMailer controller/viewer中生成URL。我说的生成URL主要指url_for方法生成绝对路径,也就是 url_for(:only_path => false, :controller => xxx, :action => xxx)。我们都知道组成一个绝对路径需要有protocol, host, port和相对路径。在ActionMailer里面, request instance是不存在的,所以组成绝对路径的protocol, host 和 port是得不到的。
动态语言在AOP方面有着天然的优势。上面的问题可以很方面用一个around filter来解决。下面是代码片断
module InstanceMethods
def url_for_everywhere
begin
request = self.request
::ActionController::UrlWriter.module_eval do
@old_default_url_options = default_url_options.clone
default_url_options[:host] = request.host
default_url_options[:port] = request.port unless request.port == 80
protocol = /(.*):\/\//.match(request.protocol)[1] if request.protocol.ends_with?("://")
default_url_options[:protocol] = protocol
end
yield
ensure
::ActionController::UrlWriter.module_eval do
default_url_options[:host] = @old_default_url_options[:host]
default_url_options[:port] = @old_default_url_options[:port]
default_url_options[:protocol] = @old_default_url_options[:protocol]
end
end
end
end
思路很简单,::ActionController::UrlWriter中有默认的default_url_options的一些参数,filter选把这些参数保存起来,尝试去取当前request对应的参数,如果有那么应用,并继续执行后面的程序(url_for就在这里),最后需要把最原始的default_url_options restore。通过这样一个around filter我们就可以透明地解决ActionMailer中url_for不能使用的问题。当然也可以把它插件化
分享到:
- 2007-09-06 12:56
- 浏览 1655
- 评论(0)
- 论坛回复 / 浏览 (0 / 2254)
- 查看更多
相关推荐
一种简单的方法是在每个ActionMailer :: Base祖先方法的末尾放置一些SentMailLog.create()。 看起来不是真的DRY,但是可以使用。 我通过ActionMailer API进行了查看,但没有像AR甚至ActionController那样的钩子。...
该gem提供了SparkPost与ActionMailer的无缝集成。 它提供了一个delivery_method基于SparkPost API,使越来越设置,并通过SparkPost在Rails应用程序相当简单发送电子邮件。 入门 将宝石添加到您的Gemfile gem '...
letter_bomb 电子邮件非常危险 - 从浏览器的安全性检查您的邮件模板。 安装 添加到您的Gemfile : gem "letter_bomb" , group : :development 并bundle 。 用法 在你的routes.rb安装引擎: ...
它拦截所有url_for调用(因此也拦截link_to调用),并更改最终URL,以将添加到您的URL中。 安装 将此行添加到您的应用程序的Gemfile中: gem 'google_analytics_mailer' 然后执行: $ bundle 或将其自己安装为: ...
SendGrid ActionMailer ... 与Rails 5和Sendgrid API v3兼容。 安装 将此行添加到您的应用程序的Gemfile中: gem 'sendgrid-actionmailer' 用法 为您的应用程序创建一个。... sendgrid_actionmailer_settings = {
只需要在配置好ActionMailer后,设置`:delivery_method`为`:roadie`,并指定基础URL,Roadie就会自动处理邮件中的CSS和URL问题。 在实际开发中,你可以通过以下代码示例了解如何在Ruby项目中使用Roadie: ```ruby ...
actionmailer-2.3.5.gem
actionmailer-2.3.11 安装redmine必须的gem插件
抽象通知者 抽象通知程序是一种工具,使用该工具,您可以像Action Mailer处理电子邮件通知一样来描述/建模任何基于文本的通知(例如,推送通知)。 抽象通知程序(顾名思义)没有提供用于发送通知的任何特定实现。...
capybara-email, 使用Capybara测试你的ActionMailer和Mailer消息 CapybaraEmail 轻松测试 ActionMailer 和邮件在你的集成测试中安装将此行添加到你的应用程序的Gemfile中:gem 'capybara-email'然后执行: $ bund
用于通知的电子邮件通知程序,不依赖于 ActionMailer,可以在 Rails 之外使用,即与 Grape 一起使用。 截至目前,它仅支持文本电子邮件。 作为一种传递方法,它可以使用或或您定义的自定义方法。 为什么? 我已经...
ResqueMailer 一个gem插件,允许ActionMailer准备的消息异步传递。 假设您正在使用进行后台作业。 请注意,Resque :: Mailer的最新(2.0+)版本仅适用于Rails 3.x或更高版本。 对于与Rails 2兼容的版本,在Gemfile中...
mail_safe 在开发使用ActionMailer的应用程序时,邮件保险箱提供了一个安全网。 它可以防止电子邮件逃逸。 一旦安装并配置了该gem,就可以确保您的应用不会将电子邮件发送到外部电子邮件地址。 取而代之的是,通常会...
ActionMailerMatchers提供RSpec匹配器以测试常见的ActionMailer功能。 安装 将此行添加到您的应用程序的Gemfile中: group :test do gem 'action_mailer_matchers' , '~> 1.0' end 然后执行: $ bundle install...
ActionMailer 版本这个插件现在与ActionMailer的补丁版本一起工作,它使用mail gem 而不是tmail 。 将分支rails-2.3.14用于标准ActionMailer 。为什么 ? 在开发和试生产中,您经常需要测试电子邮件发送。 在现实...
email-spec, 在使用ActionMailer或者Pony的ruby 应用中,收集 testing/minitest匹配器的集合和用于测试电子邮件的Cucumber 步骤 电子邮件规范用于 RSpec 。MiniTest 和 Cucumber 步骤的匹配器集合,使测试邮件顺利...
松弛::邮件ActionMailer启发了消息对象。用法将Gemfile gem 'slack-mail'添加到您的Gemfile并安装它。 # Basic usage.Slack :: Mail . new ( text : "..." ) . deliver_now# Using `ActiveJob` to send async (if ...
Http :: Actionmailer 简短说明和动机。 用法 如何使用我的插件。 安装 将此行添加到您的应用程序的Gemfile中: gem 'http-actionmailer' 然后执行: $ bundle 或自己安装为: $ gem install ...
该库可与ActionMailer和Pony 。 与ActionMailer一起使用时,它可与ActiveRecord Mailer和。 如果您要结合自动浏览器解决方案(例如Selenium)来测试电子邮件,则需要在测试环境中使用 。 (这是因为您的测试过程和...
用于ActionMailer的 SMTP API集成。 请上查看该协议的详细信息。 安装 将Mandriller宝石添加到您的Gemfile中。 gem "mandriller" 并运行bundle install 。 将以下内容添加到config/environments/任何环境设置中...