我想在另一个控制器的类名之前访问application_controller
变量
class TodosController < eval("#{subdomain_name.humanize}Controller")
我想自定义我的ToDoController
,为不同的子域继承不同的控制器。
只需使继承方法的实现依赖于子域。
避免这种方法成为丛林的一种方法是使用单独的对象来建模子域特定的"策略"。以下是一种可能的解决方案,用于实现子域特定的过滤前
class TodosController < ApplicationController
before_filter :require_foobar_is_allowed
# ...
end
定义应用程序控制器中的过滤器(或TodosController
中包含的问题)
class ApplicationController
# ...
protected
def require_foobar_is_allowed
unless subdomain_policy.foobar_allowed_for?(current_user)
render nothing: true, status: 403
end
end
def subdomain_policy
"#{subdomain_name}Policy".constantize.new
end
end
然后在域特定的策略对象(普通的旧Ruby对象)中定义实现,可以放置到例如app/models/
class FoobarSubdomainPolicy
def foobar_allowed_for?(user)
# in the foobar subdomain, foobar is allowed for everyone
true
end
end
class BazSubdomainPolicy
def foobar_allowed_for?(user)
# in the baz subdomain, foobar is only allowed for admins
user.admin?
end
end
根据"继承的"功能的实际外观,Devise等宝石中也可能存在现成的解决方案。