Rails : 컨트롤러 클래스 이름을 기반으로 모델 클래스 이름을 얻는 방법은 무엇입니까?


답변:


190

이렇게하면됩니다.

class HouseBuyersController < ApplicationController

  def index
    @model_name = controller_name.classify
  end

end

이것은 종종 컨트롤러 작업을 추상화 할 때 필요합니다.

class HouseBuyersController < ApplicationController

  def index
    # Equivalent of @house_buyers = HouseBuyer.find(:all)
    objects = controller_name.classify.constantize.find(:all)
    instance_variable_set("@#{controller_name}", objects)
  end

end

@model_name = controller_name.classify # "HouseBuyers"반환 감사합니다!
Peter Ehrlich 2012 년

1
ActiveSupport :: 인플 굉장합니다
자레드 벡

귀하의 필요에 따라 (이 질문은 세부 사항을 지정하지 않음) controller_name.sub('_', ' ').titleize"House Buyers"를 얻기 위해 할 수 있습니다 .
user664833 2012

로직 (모델 클래스를 얻기위한)을 별도의 유틸리티 메소드로 이동하는 것이 좋습니다. 결과를 상수로 저장하면 액세스 속도를 높일 수 있습니다. new.controller_name.classify.constantize클래스 정의에서 사용할 수 있습니다 .
Kelvin

나는 이것이 어떤 컨트롤러가 상속하는지에 따라 응용 프로그램 컨트롤러에서도 작동한다는 점에 주목할 가치가 있다고 생각합니다.
weltschmerz

40

컨트롤러와 모델이 동일한 네임 스페이스에있는 경우 원하는 것은

controller_path.classify

controller_path네임 스페이스를 제공합니다. controller_name하지 않습니다.

예를 들어 컨트롤러가

Admin::RolesController

그때:

controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role"        # INCORRECT

6

약간의 해킹이지만 모델 이름이 컨트롤러 이름을 따서 명명 된 경우 :

class HouseBuyersController < ApplicationController
  def my_method
    @model_name = self.class.name.sub("Controller", "").singularize
  end
end

... @model_name 인스턴스 변수에 "HouseBuyer"를 제공합니다.

다시 말하지만, 이것은 "HouseBuyersController"가 "HouseBuyer"모델만을 다룬다는 거대한 가정을 만듭니다.


4

작동하는 네임 스페이스의 경우 :

def resource_class
 controller_path.classify.constantize
end

0

코드가 따르지 않는 것처럼 보이는 기본 MVC를 사용하는 경우에는 불가능합니다. 컨트롤러가 모델 인 것 같지만 유형이있을 수 있습니다. 어쨌든 컨트롤러와 모델은 Rails MVC에서 근본적으로 분리되어 있으므로 컨트롤러는 연결된 모델을 알 수 없습니다.

예를 들어 post라는 모델이있을 수 있습니다. 여기에는 posts_controller 컨트롤러가 있거나 article_controller와 같은 컨트롤러가있을 수 있습니다. Rails는 컨트롤러에서 다음과 같은 실제 코드를 정의 할 때만 모델에 대해 알고 있습니다.

def index
  @posts = Post.all
  @posts = Article.all
end  

Rails 표준 컨트롤러에서는 모델이 무엇인지 알 수있는 방법이 없습니다.


0

내 컨트롤러와 모델의 네임 스페이스가 지정 되었기 때문에 허용 된 솔루션이 작동하지 않았습니다. 대신 다음과 같은 방법을 생각해 냈습니다.

def controllers_model
  (self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.