RuntimeError default_url_options host и root_url (с поддоменом) - PullRequest
3 голосов
/ 08 апреля 2011

У каждого пользователя моего приложения есть собственный URL (через поддомен), который хранится в БД.

Мой запрос прост, я хотел бы отправить "URL пользователя" через фид json, например:

{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, у меня появляется эта ошибка:

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'}

Я не понимаю, почему и как я это исправляю. Пожалуйста, помогите мне.

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Чтобы использовать url helper root_path в вашей модели, я предполагаю, что вы добавляете Rails.application.routes.url_helpers или подобное. Эти помощники всегда создают URL-адреса, ссылающиеся на default_url_options. ActionController определяет параметры по умолчанию из текущего запроса. config.action_mailer.default_url_options только для почтовых программ, которые не запрашивают интуитивные настройки по умолчанию, не для использования в моделях. Представления делегируются на контроллер / почтовик. Каждый класс, в котором смешаны эти помощники, должен предоставить default_url_options, но, как правило, переопределять его просто плохая идея. Введите URL-адрес из контроллера, почтовой программы или представления.

Если вам действительно нужно, в вашей модели: delegate :default_url_options, to: ActionMailer::Base

1 голос
/ 11 июня 2011

У меня была похожая проблема.Каким-то образом это как-то связано с url_helper в actionpack и именем моего поля.Кажется, проблема с именами полей, заканчивающимися на * _url.Не совсем понимаю, почему, но у меня было поле с именем login_url, которое я переименовал в login_uri (обратите внимание на изменение с l на i), и это решило мою проблему.

...