我运行一个拥有多个域名的Ruby on Rails网站。我在数据库中有一个“网站”表,用于存储与每个域名相关的配置值:
网站
- 域
- 姓名
- 标语
- admin_email
- 等等......
目前,我在ApplicationController中的每个请求开头(before_filter)加载网站对象:
@website = Website.find_by_domain(request.host)
问题是当我需要从模型的方法访问@website对象时。我想避免必须到处传递@website。最好的解决方案是使用类似于APP_CONFIG的东西,但每个域名。
def sample_model_property
- “#{@website.name}是一个很棒的网站!” 结束
你会怎么做?
答案 0 :(得分:0)
如果这是一个控制器实例变量,那么除了Controller和View域之外,你应该可以访问@website。如果你需要以相同的容量将某些东西推送到Model空间,你必须通过它,或者通过类似model_helper方法的东西来破解它。
您可能会做的是在您的网站类上使用一种单例方法,例如:
class Website < ActiveRecord::Base
cattr_accessor :current_website
end
然后在控制器中你可以做以下事情:
before_filter :load_current_website
def load_current_website
Website.current_website = Website.find_by_domain(request.host)
end
这样你可以在模型空间的任何地方引用Website.current_website,事情应该是同步的。请注意,这可能不是完全线程安全的,应该在使用之前在类似生产的环境中进行广泛测试。