我试图在帖子模型,上传模型等上使用多态评论模型。通常我会有一个@parent资源范围一个到另一个,以便Rails建立关系。但是由于这是一个多租户子域样式的应用程序,因此还需要将所有资源限定在current_account的范围内。我正在努力解决如何在current_account下范围@父资源。
在ApplicationController我有一个current_account方法,一个find_parent和一个parent_collection方法:
#Application_controller
class ApplicationController < ActionController::Base
before_filter :current_account
def current_account
unless is_root_domain?
@current_account ||= Account.find_by_subdomain(request.subdomains.first)
end
@current_account
end
def find_parent
params.each do |name ,value|
@parent = $1.pluralize.classify.constantize.find(value) if name =~ /(.*?)_id/
return if @parent
end
end
def parent_collection
@parent_collection ||= current_account.send parent.pluralize
end
结束#comments_controller with only @parent resource without reference to current_account
class CommentsController < ApplicationController
before_filter :find_parent
def new
@comment = @parent.comments.build
end
def create
@comment = @parent.comments.build(params[:comment])
.....
.....
end
end
#comments_controller using only current_account resource without reference to @parent
class CommentsController < ApplicationController
before_filter :current_account
def new
@comment = current_account.comments.build
end
def create
@comment = current_account.comments.build(params[:comment])
.....
.....
end
end
任何关于如何在控制器中以@parent的方式调用current_account的指南,以及是否需要我放在applications_controller中的parent_collection方法。由于
让我们假设您的@parent资源是Post
模型。然后我会想象:
a)你的Account
模型has_many :posts
b)你的Post
模型belongs_to :account
c)你的Post
模型has_many :comments, :as => :commentable
c)你的Comment
模型belongs_to :commentable, :polymorphic => true
@parent.where(:account_id => current_account.id).comments
你也可以将它重构为可注释的模型:
def Post < ActiveRecord::Base
scope :by_account, lambda { |account_id| where(:account_id => account_id) }
end
,在控制器中像这样使用它:
@parent.by_account(current_account.id).comments