代码之家  ›  专栏  ›  技术社区  ›  Daniel Vandersluis

确定ActiveRecord模型中的域

  •  1
  • Daniel Vandersluis  · 技术社区  · 16 年前

    我正在将应用程序从使用子空间的子目录迁移到子域(即.NET.COM/~用户到用户.No..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
    

    我想为子域更新它,但不将域硬编码到方法中。如您所见,我正在使用子域fu插件,它提供了一些方法,我可以使用这些方法来实现这一点,但它们需要访问 request ,该模型不可用。

    我知道这样做被认为是不好的 要求 在模型中可用,所以我希望避免这样做,但我不确定是否有好的方法来做到这一点。我想,每次初始化模型时,我都可以传递域,但我认为这不是一个好的解决方案,因为每次初始化类时,我都必须记住这样做,这是经常发生的。

    2 回复  |  直到 16 年前
        1
  •  1
  •   molf    16 年前

    # 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

        2
  •  1
  •   Daniel Vandersluis    16 年前

    虽然molf的答案是好的,但它并没有解决我的具体问题,因为有一些实例需要调用其他模型 User#home_url ,因此,为了在域中传递,我必须更新很多方法。

    base_domain before_filter 在里面 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 .