如何在现有的Rails应用程序中插入此子域过滤?

时间:2013-10-18 16:27:39

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 subdomain

我有一个现有的Rails 3.2应用程序,它基本上是一个简单的产品目录。现在我面临的情况是,我只需要允许基于用户用来访问网站的子域与特定产品进行交互。

Product模型belongs_to一个Repository,其中subdomain为值。

请求:

http://bobs_store.myapp.com/products

仅显示具有名称为bobs_store的存储库的产品。

引入此过滤的最佳位置/位置在哪里?我可以在模型级别创建某种默认范围来执行此操作吗?我唯一的问题是我无法从模型中访问请求,这是否意味着我必须将子域传递给我对该模型的每次调用?

另外一件事,对Product模型的所有调用都是这样的:

current_user.products.<whatever>

是否有可能以某种方式修改我的current_user辅助方法以获得我想要的功能?除此之外,我能用路线做些什么吗?这些是黑暗中的镜头,但我希望有一些我可以使用的Rails快捷方式,我不知道。

2 个答案:

答案 0 :(得分:1)

我以前看过它的方法是在模型上有一个范围,例如Product.repository_scope

class Product < ActiveRecord::Base
  def self.repository_scope(repository)
    where(repository: repository)
  end
end

我不确定每次都不必传入当前存储库的好方法。

答案 1 :(得分:1)

正如luri G所提到的,请观看此Railscast: 221-Subdomains

创建范围以查询存储库的产品

class Product < ActiveRecord::Base
   belongs_to :repository

   scope :for_repository,
         (lambda do |repository_name|
            includes(:repository).
            merge(Repository.where(name: repository_name))
         end)
end

根据Railscasts实现子域路由处理逻辑后,在控制器中,您将调用产品以获取如下存储库:

current_user.products.for_repository(request.subdomain)