我的应用程序的每个用户都有一个自定义url(通过子域)存储在db.
我的请求很简单,我想通过json feed发送"用户url",像这样:
{user_name: "vincent", :user_url: "vincent.my_app.com"}
为了做到这一点,我已经覆盖了用户模型的as_json函数:
def as_json(options={})
{
:user_name: self.name,
:user_url: root_url(:subdomain => self.subdomain)
}
end
我有这个额外的模块(这个工作很好,不是实际问题):
module SubdomainHelper
def with_subdomain(subdomain)
subdomain = (subdomain || "")
subdomain += "." unless subdomain.empty?
host = ActionMailer::Base.default_url_options[:host]
[subdomain, host].join
end
def url_for(options = nil)
if options.kind_of?(Hash) && options.has_key?(:subdomain)
options[:host] = with_subdomain(options.delete(:subdomain))
end
super
end
end
但是当我得到json feed时,我有这个错误:
RuntimeError (Missing host to link to! Please provide :host parameter or set default_url_options[:host]):
指向用户模型的"as_json"方法。
当然每个环境实现default_url_options,在dev.rb:
config.action_mailer.default_url_options = {:host => 'my_app:3000'}
我不明白为什么和如何解决它。
我也遇到过类似的问题。不知何故,它似乎与actionpack的url_helper和我的字段名有关。似乎是一个以*_url结尾的字段名的问题。不完全明白为什么,但我有一个名为login_url的字段,我重命名为login_uri(注意从l到I的变化),它解决了我的问题。
要在您的模型中使用url助手root_path
,我假设您正在混合Rails.application.routes.url_helpers
或类似的内容。这些帮助程序总是构造引用default_url_options
的url。ActionController
从当前请求中计算出这些默认选项。config.action_mailer.default_url_options
仅用于没有请求直觉默认值的邮件,不用于模型。视图委托给控制器/邮件。每个混合了这些帮助器的类都必须提供default_url_options
,但通常重新定义它是个坏主意。从控制器、邮件器或视图提供URL。
如果你真的需要,在你的模型中:delegate :default_url_options, to: ActionMailer::Base