我正在构建控制器问题,在其中我需要引用当前控制器的相关模型。所以,如果我有类似的东西:
class UsersController < ApplicationController
include Concern
end
module Concern
extend ActiveSupport::Concern
def bla
self.model # ??
end
end
我希望在bla
中获取当前模型的引用,这样当我在Concern
中加入UserController
时,我会得到一个User
引用。
这在Rails中是否可行?
答案 0 :(得分:5)
您可以执行此操作,但前提是您已遵循“约定优于配置”命名控制器和型号
controller_name.classify.constantize
答案 1 :(得分:1)
答案 2 :(得分:1)
您可以从控制器的名称推断它,但它不是100%可靠的,它只对RESTful控制器有意义。
这意味着,如果您的ArticlesController
具有默认的RESTful路由(index
,show
,new
,ecc),则可以安全地假设< em>相关的模型将为Article
。同样,您可以假设RESTful UsersController
与User
模型有关。
这当然对非RESTful控制器没有意义。例如,您可以使用GraphPollingController
,而不依赖于特定模型。
答案 3 :(得分:0)
在你的控制器动作调用中
self.class.name.sub("Controller", "").singularize.constantize
答案 4 :(得分:0)
为您的问题添加以下方法:
def resource
resource_name = self
.class
.name
.underscore
.gsub(/_controller$/, '')
.singularize
self.instance_variable_get("@#{resource_name}")
end
现在您可以通过实例var(即@user
)检索您的资源。