2010-01-12 82 views
1

我正在将我的应用程序从用户空间的子目录迁移到子域(即domain.com/~user到user.domain.com)。我有一个方法,在我的用户类目前获得每个用户的“家”网址:确定ActiveRecord模型中的域

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在模型中可用,所以我想避免这样做,但我不知道是否有一个好方法来做到这一点。我猜想,每次模型初始化时都可以传递域,但我认为这不是一个好的解决方案,因为每次初始化类时都必须记得这样做,而这经常发生。

回答

1

虽然molf的回答很好,但它并没有解决我的具体问题,因为有些情况下其他模型需要调用User#home_url,所以会有很多方法需要更新才能传递该域名。

相反,我把灵感来自于他的最后一段,并增加了一个base_domain变量,以我的应用程序的配置类,这是在集before_filterApplicationController

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

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

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