2016-10-26 9 views
3

ドロップダウンでは、すべてのコントローラクラスを特定の操作に使用される別のドロップダウンリストに動的にフェッチしました。 'DashboardsController'のようなモデルを持たないコントローラーの中には、Dashboardモデルを持たないものがあります。これは単にダッシュボードを表示するために使用されます。コントローラにモデルがあるかどうかを確認する

したがって、基本的にモデルなしでコントローラをフィルタリングする必要があります。コントローラクラスを渡してtrue/falseを返すメソッドが必要です。

def has_model?(controller_klass) 
# TODO 
end 

答えて

2

コントローラの名前を文字列として渡すと、このようなことを試すことができます。この解決策では、モデルがモデルを定義するためにApplicationRecordが使用されたレール5の前に、ご使用のモデルがActiveRecordを使用していることを前提としています。その場合はActiveRecord::BaseApplicationRecordに変更してください。また、普通の古いルビーオブジェクト(PORO)であるモデルを持っている場合、これはそれらのために働いていません。

def has_model?(controller_klass) 
    begin 
    class_string = controller_klass.to_s.gsub('Controller', '').singularize 
    class_instance = class_string.constantize.new 
    return class_instance.class.ancestors.include? ActiveRecord::Base 
    rescue NameError => e 
    return false 
    end 
end 
+1

この回答は削除されました。 – SteveTurczyn

+0

これは、開発(コメント)に感謝してくれて本当に感謝しています。 –

+0

私はレール4を使用しています – Arif

0

このメソッドは例外に依存せず、入力としてクラスまたはストリングとして機能します。これは、任意のRailsのバージョンのために働く必要があります。

def has_model?(controller_klass) 
    all_models = ActiveRecord::Base.descendants.map(&:to_s) 
    model_klass_string = controller_klass.to_s.sub(/Controller$/,'').singularize 
    all_models.include?(model_klass_string) 
end 

注意:あなたがいる場合

config.eager_load = true 

で設定/環境/ development.rb

を設定する必要がありますActiveRecord以外のモデルを使用している場合、前の注釈を無視して使用することができます。

all_models = Dir[File.join(Rails.root,"app/models", "**","*.rb")].map{|f| File.basename(f,'.rb').camelize} 
関連する問題