0

Rails のベスト プラクティスに関するアドバイスが必要です。実際に私のアプリケーションでは、 mycars_controllerと myについて、 、、およびactionscontacts_controllerの両方のコントローラーのデータ (以下) をロードする必要があります。newcreateeditupdate

@countries        = Country.all
@types            = Type.all
@departments      = Department.all
@models           = Model.all // This one is only needed on contacts_controller

それらは選択ボックスに入力されます。newcreateeditおよびupdateアクションごとに繰り返す必要があるため、load_resourceを myに作成しましたapplication_controller:

application_controller.rb

def load_resources
  @countries        = Country.all
  @types            = Type.all
  @departments      = Department.all
  @models           = Model.all // This one is only needed on contacts_controller
end

しかし、他のコントローラーに他のデータをロードしたい場合はどうすればよいのでしょうか? そのためのベストプラクティスがあるかどうか知りたいですか?

Presenter パターンを使用してみましたが、それらのデータはセレクト ボックス内のデータであり、特に何にも関連付けられていないため、実際には機能しませんでした。

ご協力いただきありがとうございます

4

1 に答える 1

3

1 つ目は、すべてのアクションでリソースをロードする必要がないこと、2 つ目は、キャッシュを使用してパフォーマンスを向上できることです。

すべてのアクションでリソースをロードしない

create標準の REST 規則に従っていると仮定すると、これらのリソースがドロップダウン用である場合、およびには必要ありませんupdate。これら 2 つのアクションのみがユーザーにページを表示するため、必要なのはnewとだけです。およびは、フォームによって呼び出されるアクションであり、他のページにリダイレクトされます。editcreateupdate

あなたに追加する代わりに、あなたのとapplication_controllerに a を追加するだけですbefore_filtercontacts_controllercars_controller

contact_controller.rb

before_filter :load_resources_for_dropdowns, :only => [:new, :edit]

def load_resource_for_dropdowns
  ....
end

キャッシュを使用する

また、データベースからリソースをロードすることによるパフォーマンスへの影響が懸念される場合は、キャッシュの使用を検討できます。たとえば、国のリストが変更されない場合は、次の操作を安全に実行できます。

国.rb

def get_all_cached
  Rails.cache.fetch('all_countries') { Country.all }
end

contact_controller.rb

before_filter :load_resources_for_dropdowns, :only => [:new, :edit]

def load_resource_for_dropdowns
  @countries = Country.get_all_cached
end

国が変更された場合は、何かが変更されるたびにキャッシュをクリアするチェックを追加できます。

国.rb

after_save :clear_cache

def clear_cache
  Rails.cache.delete('all_countries')
end

def get_all_cached
  Rails.cache.fetch('all_countries') { Country.all }
end
于 2013-10-04T03:36:52.133 に答える