获取当前控制器的模型

时间:2015-04-06 08:52:53

标签: ruby-on-rails ruby

我正在构建控制器问题,在其中我需要引用当前控制器的相关模型。所以,如果我有类似的东西:

class UsersController < ApplicationController
  include Concern
end

module Concern
  extend ActiveSupport::Concern

  def bla
    self.model # ??
  end
end

我希望在bla中获取当前模型的引用,这样当我在Concern中加入UserController时,我会得到一个User引用。

这在Rails中是否可行?

5 个答案:

答案 0 :(得分:5)

您可以执行此操作,但前提是您已遵循“约定优于配置”命名控制器和型号

controller_name.classify.constantize

答案 1 :(得分:1)

您可以访问使用controller_name获取控制器的名称,然后使用classify获取类名。

简而言之:

controller_name.classify

答案 2 :(得分:1)

您可以从控制器的名称推断它,但它不是100%可靠的,它只对RESTful控制器有意义。

这意味着,如果您的ArticlesController具有默认的RESTful路由(indexshownew,ecc),则可以安全地假设< em>相关的模型将为Article。同样,您可以假设RESTful UsersControllerUser模型有关。

这当然对非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)检索您的资源。