1

我运行一个有多个域名的 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} 是一个很棒的网站!"
结尾

你会怎么做?

4

1 回答 1

0

如果这是一个控制器实例变量,那么您应该可以在任何需要它的控制器和视图域中访问@website。如果您需要以相同的容量将某些内容推送到模型空间,您要么必须传递它,要么通过诸如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 并且事情应该是同步的。请注意,这可能不是完全线程安全的,在使用它之前应该在类似生产的环境中进行广泛的测试。

于 2010-06-01T14:17:08.030 回答