使用restful_authentication生成的代码,我们通常会将“localhost”作为注册和激活邮件中的URL。我试图创建这样的东西:
def signup_notification(user, host)
setup_email(user)
@subject += 'Please activate your new account'
@body[:url] = "http://#{host}/activate/#{user.activation_code}"
end
但是,由于传递邮件的实际调用是在Observer中,我不能这样做:
UserMailer.deliver_signup_notification(user, request.host_with_port)
由于请求方法在模型中不可用。这样做的最佳方法是什么?
我考虑过将每个域的URL存储在YAML文件中,然后在启动时加载它,但随后端口可能会发生变化,因此无法正常工作。
或者,我考虑在加载应用程序时设置的某个地方创建一个静态类变量,但我不知道如何去做。请求方法是否可用于初始化程序?
答案 0 :(得分:1)
使用ActiveMailer,我在config/envrionments/production.rb
config.action_mailer.default_url_options = { :host => "my.host.com" }
在模型app/models/event_mailer.rb
def new_event(event)
recipients EventMailer::NO_REPLY
bcc event.emails('new_event')
from EventMailer::FROM_EMAIL
subject "#{EventMailer::SUBJECT_HEADER} Event Updated :: #{event.title}"
content_type "text/plain"
body :event => event
end
然后在邮件程序视图中app/views/event_mailer/new_event.rb
You can view the event by going to: <%= url_for(:controller => "events", :action => "show", :id => @event.id, :only_path => false) %>
通过邮件生成:
You can view the event by going to: http://my.host.com/events/11
答案 1 :(得分:1)
我也遇到了同样的问题,这就是我做过的事情
我添加:主机到attr_accessible,然后我添加这个方法
def host=(value) write_attribute :host, value end
在用户控制器中,在发送电子邮件的方法中,如创建和激活我放
@user.host = request.host_with_port
因为我还是一个noob-on-rails所以我真的希望有人能为这个问题找到最佳实践解决方案。
答案 2 :(得分:1)
尝试使用http://codeshooter.wordpress.com/2009/08/
中描述的current_request插件为我工作
答案 3 :(得分:0)
您的服务器所访问的主机名可在请求的Host标头中找到。您不应该在模型中访问它(假设rails是理智的)。但是,如果您可以访问控制器中的请求对象,则可以在从db中提取模型对象时将该值插入到模型字段中。