我想在另一个控制器的类名之前访问application_controller
变量
class TodosController < eval("#{subdomain_name.humanize}Controller")
我想自定义ToDoController
以继承不同子域的不同控制器。
答案 0 :(得分:-1)
只需使继承方法的实现依赖于子域。
避免此类方法成为的一种方法是if-else-case-jungle是使用单独的对象来模拟子域特定的策略&#34;。以下是在过滤器
之前实现特定于子域的一种可能解决方案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
取决于&#34;继承&#34;功能实际上看起来,可能还存在像Devise这样的宝石中的现成解决方案。