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

时间:2015-11-28 11:50:50

标签: ruby-on-rails subdomain

我想在另一个控制器的类名之前访问application_controller变量

class TodosController < eval("#{subdomain_name.humanize}Controller")

我想自定义ToDoController以继承不同子域的不同控制器。

1 个答案:

答案 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这样的宝石中的现成解决方案。