我有一个现有的Rails 3.2应用程序,它基本上是一个简单的产品目录。现在我面临的情况是,我只需要允许基于用户用来访问网站的子域与特定产品进行交互。
Product
模型belongs_to
一个Repository
,其中subdomain
为值。
请求:
http://bobs_store.myapp.com/products
仅显示具有名称为bobs_store
的存储库的产品。
引入此过滤的最佳位置/位置在哪里?我可以在模型级别创建某种默认范围来执行此操作吗?我唯一的问题是我无法从模型中访问请求,这是否意味着我必须将子域传递给我对该模型的每次调用?
另外一件事,对Product
模型的所有调用都是这样的:
current_user.products.<whatever>
是否有可能以某种方式修改我的current_user
辅助方法以获得我想要的功能?除此之外,我能用路线做些什么吗?这些是黑暗中的镜头,但我希望有一些我可以使用的Rails快捷方式,我不知道。
答案 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)