访问类名之前的应用程序控制器变量



我想在另一个控制器的类名之前访问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等宝石中也可能存在现成的解决方案。

最新更新