3

多くの異なるモデルの構築を担当する RESTful コントローラーがあります。これは、特定のビューが正しくレンダリングされる前に、いくつかの変数を設定する必要があることを意味します。コントローラーでこれらの変数を設定すると、そのビューをレンダリングする可能性のあるさまざまなアクション間でコードを複製する必要があります。たとえば、ページ 1 のレンダリングには 5 つの変数が必要です。表示、作成、および更新のすべてがそのビューをレンダリングする場合、これらの 5 つの変数を設定するコードは、それらのコントローラー アクション間で複製されます。別の方法は、すべてのコードをビュー内に配置することです。しかし、それは本当に醜いものになる可能性があります:

<% variable1 = Model1.where(some conditions) %>
<% variable2 = Model2.where(some other conditions) %>
<% variable3 = Model3.where(some third conditions) %>

ビューに入るコードの量が多いため、このソリューションについては躊躇しています。私は常に、ビュー内のコードがデータベースに触れてはならないという原則に従ってきました。私が楽しみにしているもう 1 つの方法は、変数の設定とビューのレンダリングに焦点を当てたプライベート メソッドを作成することです。このメソッドは、レンダリングが必要なすべてのアクションから呼び出すことができます。

4

3 に答える 3

4

私の見解では、すべてのロジックをコントローラー、モデル、ヘルパー、またはライブラリーに配置する必要があります。あなたの場合、変数の設定は、ビューではなくコントローラーで行う必要があります。

コードが適切な場所にあると、アプリケーションのデバッグ、保守、またはリファクタリングがより簡単になるため、ロジックを適切な場所に配置することは非常に興味深いことです。

したがって、コードを複製せずにコントローラーに変数宣言を配置するためのいくつかのアイデアを次に示します:)

before_action (コントローラー内)

コントローラーで使用できbefore_actionます。重複コードを減らします。

たとえば、次のことができます。

before_action :set_variables

def set_variables
  @var1 = some_code
  @var2 = other_code
  ...
end

onlyまたはを使用して、before_action を特定のアクションのみに制限できます。except

before_action :set_variables, only: [:index, :edit]

これは、インデックスと編集の前にのみset_variablesを呼び出します

before_action (application_controller.rb内)

たとえば、すべてのコントローラーのすべてのインデックス アクションに before_action を追加する場合は、application_controller.rb で before_action を実行するだけです。

特定のコントローラーでこのタイプの before_action をスキップしたい場合は、skip_before_action メソッドを使用できます。

# application_controller.rb
before_action :set_variables, only: :index

# specific_controller.rb
skip_before_action :set_variables

もう 1 つ: モデル スコープ

次に、終了前の最後のこと: Model1.where(some conditions). モデルスコープはどうですか?

コードが読みやすくなり、重複が少なくなります。

class MyModel < ActiveRecord::Base
  scope :active, -> { where(is_active: true) } 
end

MyModel.active # equivalent to MyModel.where(is_active: true)
于 2013-11-12T23:37:23.927 に答える