Определить домен в модели ActiveRecord - PullRequest
1 голос
/ 12 января 2010

Я нахожусь в процессе перехода моего приложения от использования подкаталогов для пользовательского пространства к поддоменам (т. Е. Domain.com/~user to user.domain.com). У меня есть метод в моем пользовательском классе в настоящее время, чтобы получить «домашний» URL для каждого пользователя:

class User
  def home_url
    "~#{self.username}"

    # How I'd like to do it for subdomains:
    #"http://#{self.username}.#{SubdomainFu.host_without_subdomain(request.host)}"
  end
end

Я бы хотел обновить это для поддоменов, но без жесткого кодирования домена в методе. Как видите, я использую плагин subdomain-fu, который предоставляет некоторые методы, которые я мог бы использовать для этого, за исключением того, что им необходим доступ к request, который недоступен для модели.

Я знаю, что делать request доступным в модели считается плохой формой, поэтому я бы хотел этого не делать, но я не уверен, есть ли хороший способ сделать это. Думаю, я мог бы передавать домен каждый раз при инициализации модели, но я не думаю, что это хорошее решение, потому что я должен помнить об этом каждый раз, когда инициализируется класс, что часто случается.

Ответы [ 2 ]

1 голос
/ 13 января 2010

Хотя ответ molf хороший, он не решил мою конкретную проблему, так как были некоторые случаи, когда другие модели должны были вызывать User#home_url, и поэтому было бы много методов, которые мне пришлось бы обновить, чтобы передать вдоль домена.

Вместо этого я черпал вдохновение из его последнего абзаца и добавил переменную base_domain в класс конфигурации моего приложения, который задается в before_filter in ApplicationController:

module App
  class << self
    attr_accessor :base_domain
  end
end

class ApplicationController < ActionController::Base
  before_filter :set_base_domain

  def set_base_domain
    App.base_domain = SubdomainFu.host_without_subdomain(request.host)
  end
end

И, таким образом, когда мне нужно получить домен в модели, я могу просто использовать App.base_domain.

1 голос
/ 12 января 2010

Модель не должна знать о запросе, вы правы. Я бы сделал что-то вроде этого:

# app/models/user.rb
class User
  def home_url(domain)
    "http://#{username}.#{domain}"
  end
end

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  # ...

  def domain
    SubdomainFu.host_without_subdomain(request.host)
  end

  # Make domain available to all views too
  helper_method :domain
end

# where you need it (controller or view)
user.home_url(domain)

Если существует такая вещь, как канонический домашний URL пользователя, я бы создал настраиваемый домен по умолчанию (например, YourApp.domain), который можно использовать, если вы вызываете User#home_url без аргументов. Это позволяет создавать домашний URL в тех местах, где концептуально «текущий домен» не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...