【问题标题】:Determine the domain in an ActiveRecord model确定 ActiveRecord 模型中的域
【发布时间】:2010-01-12 17:28:31
【问题描述】:

我正在将我的应用程序从使用用户空间的子目录迁移到子域(即 domain.com/~user 到 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 被认为是一种不好的形式,所以我想避免这样做,但我不确定是否有一个好的方法可以做到这一点。我想,每次初始化模型时我都可以传递域,但我认为这不是一个好的解决方案,因为我必须记住每次初始化类时都这样做,这经常发生。

【问题讨论】:

    标签: ruby-on-rails model request


    【解决方案1】:

    模型不应该知道请求,你是对的。我会这样做:

    # 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)
    

    如果有诸如 canonical 用户主页 URL 之类的东西,我会创建一个可配置的默认域(例如 YourApp.domain),如果您在不带参数的情况下调用 User#home_url,则可以使用该域。这允许您在概念上不存在“当前域”的地方构建主 URL。

    【讨论】:

      【解决方案2】:

      虽然 molf 的回答很好,但它并没有解决我的具体问题,因为在某些情况下其他模型需要调用 User#home_url,因此我必须更新很多方法才能通过沿域。

      相反,我从他的最后一段中获得灵感,并在我的应用程序的配置类中添加了一个base_domain 变量,这是ApplicationController 中的before_filter 中的集合:

      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

      【讨论】:

        猜你喜欢
        • 2012-06-01
        • 2011-10-12
        • 2012-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多