1

我想从很多类似的代码中干燥我的视图和控制器。我想出于教育目的自己做这件事,我知道 InheritedResourse gem。到目前为止,我写道:

class Admin::ResourcesController < Admin::AdminBaseController
    before_filter :get_model_name

    def index
        result = @model.all #Resource.all
        instance_variable_set "@#{@@collection_resource_name}", result # @resources = result
        result # return it duo it can be used with super
    end

    def show
        result = @model.find(params[:id])
        instance_variable_set "@#{@@instance_resource_name}", result
        result
    end


    protected

    @@collection_resource_name = 'resources'
    @@instance_resource_name = 'resource'

    def self.set_resource_name(hash)
        @@instance_resource_name = hash[:instance_resource_name]
        @@collection_resource_name = hash[:collection_resource_name]
    end

    private

    def get_model_name
        @model = controller_name.classify.constantize # Resource
    end
end

只有两个动作,但你明白了:将任何模型抽象为“资源”,设置模型字段列表(或动态获取),就是这样。

首先,我认为我需要一个类实例变量,而不是@@instance_resource_name(类变量)。我是正确的?

...但是,这不是主要问题。我认为将这种代码包装在 mixin 中很酷。因为在我的示例中它是 Admin::ResourceController,但我也可以有一个 User::ResourceController 或其他东西。好的,我把它包装在一个mixin中。为了可用性,我想actions only: [:index, :show]在部分中调用类似 in controller 的东西before_filter,例如,我放 的地方。这一段代码是怎么调用的?类实例?好的,示例:

require 'active_support/concern'

module ScaffoldResources
    extend ActiveSupport::Concern
    included do

        def hello
            self.class.action_list
        end
    end

    module ClassMethods
        @action_list = [:new, :show, :index, :edit, :update, :destroy, :create]
        attr_accessor :actions_list
        def actions(*params)
            @actions_list = params
        end
    end
end

为了测试,我创建了这个小控制器:

class Admin::UsersController < Admin::ResourcesController
    include ScaffoldResources
    @actions_list = 'hard set'
    actions 'some','actions','i think'

    def show
        render json: hello
    end
end

所以,当我调用 hello 方法(它只做self.class.action_list)时,我想看到任何东西。我在 mixin 和类中设置类实例变量 - 硬编码和通过 mixin 中定义的方法。但它是零!我想你明白了,我想要达到的目标。如何实现?

4

0 回答 0