我想从很多类似的代码中干燥我的视图和控制器。我想出于教育目的自己做这件事,我知道 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 中定义的方法。但它是零!我想你明白了,我想要达到的目标。如何实现?