回答:
これはそれを行います:
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
controller_name.sub('_', ' ').titleize
「ハウスバイヤー」を取得することができます。
new.controller_name.classify.constantize
クラス定義で使用できます。
少しハックですが、モデルにコントローラー名にちなんだ名前を付けると、次のようになります。
class HouseBuyersController < ApplicationController
def my_method
@model_name = self.class.name.sub("Controller", "").singularize
end
end
... @model_nameインスタンス変数で「HouseBuyer」を取得します。
繰り返しになりますが、これは「HouseBuyersController」が「HouseBuyer」モデルのみを処理するという大きな仮定を行います。
これは、コードが従わないように見えるデフォルトのMVCを使用している場合は不可能です。あなたのコントローラーはモデルのようですが、たぶんあなたはそこにタイプを持っています。とにかく、コントローラーとモデルは基本的にRails MVCで分離されているため、コントローラーはそれらが関連付けられているモデルを認識できません。
たとえば、postというモデルがあるとします。これは、posts_controllerコントローラーを持つことも、articles_controllerのようなコントローラーを持つこともできます。Railsは、次のようなコントローラーで実際のコードを定義する場合にのみモデルを認識します
def index
@posts = Post.all
@posts = Article.all
end
Railsの標準コントローラーでは、モデルが何かを知る方法はありません。