【发布时间】:2009-10-21 19:50:32
【问题描述】:
我正在开发一个使用子域来隔离独立帐户站点的 Rails(当前为 2.3.4)应用程序。明确地说,我的意思是 foo.mysite.com 应该显示 foo 帐户的内容,而 bar.mysite.com 应该显示 bar 的内容。
确保所有模型查询都限定在当前子域范围内的最佳方法是什么?
例如,我的一个控制器看起来像:
@page = @global_organization.pages.find_by_id(params[:id])
(注意@global_organization 是通过 subdomain-fu 在 application_controller 中设置的。)
当我更喜欢这样的事情时:
@page = Page.find_by_id(params[:id])
Page 模型查找的位置会自动限定到正确的组织。我试过使用这样的 default_scope 指令:(在 Page 模型中)
class Page < ActiveRecord::Base
default_scope :conditions => "organization_id = #{Thread.current[:organization]}"
# yadda yadda
end
(同样,需要注意的是,同一个 application_controller 将 Thread.current[:organization] 设置为组织的 id 以进行全局访问。)这种方法的问题是默认范围在第一个请求时设置并且永远不会更改对不同子域的后续请求。
到目前为止,三个明显的解决方案:
1 为每个子域使用单独的虚拟主机,并为每个子域运行不同的应用程序实例(使用 mod_rails)。此方法不适用于此应用。
2 使用上面的原始控制器方法。不幸的是,应用程序中有相当多的模型,其中许多模型是从组织中删除的一些连接,因此这种表示法很快变得很麻烦。更糟糕的是,这主动要求开发人员记住并应用限制或冒着重大安全问题的风险。
3 使用 before_filter 在每个请求上重置模型的默认范围。不确定此处的性能影响或如何最好地选择每个请求更新的模型。
想法?我还缺少其他解决方案吗?这似乎是一个足够普遍的问题,必须有一个最佳实践。感谢所有输入,谢谢!
【问题讨论】:
标签: ruby-on-rails