1

レール 3.2.6. 次のコントローラーとビューの組み合わせがあります (簡略化されていますが、実際には割り当てはいくつかのモデル呼び出しの結果です)。

ApplicationController:

def set_menu_vars
  @var1 = 1
  @var2 = 2
end

SomeController < ApplicationController:

def some_action
  set_menu_vars
end

対応する (部分、共有) ビュー (haml):

- if @var1 > 0
  %p= @var1

これまでのところ、呼び出すアクションを忘れるまで、これまでのところ非常に良好ですset_menu_vars-今では例外が発生しますundefined method '>' for nil:NilClassset_menu_varsこれは非常に理解できることであり、その部分ビューが使用されている場合は、自動的に呼び出されるようにしたいと考えています。

だから私はビューを次のように変更しようとします

- @controller.set_menu_vars
...

(グーグル)しかし、それ@controllernil. さて、これらの答えは Rails 2 のもののようです。に変えてみました

- controller.set_menu_vars
...

現在set_menu_varsは正常に呼び出されています@var1が、まだnilビュー内にあります。

問題は、タスクを達成するための正しい方法は何かということです。これらの変数ごとにコントローラーにメソッドがありますか (インスタンス変数を探して、モデルを最大 1 回呼び出しますか?) それとも他の方法ですか?

UPD : 問題の部分ビューは、コントローラーとそのアクションに直接関係しません。これは論理的にレイアウトの一部です (注意が必要なタスクのグループへのリンクを示すダッシュボード)。そのため、コントローラ アクションの約半分の中set_menu_varsで複数の分岐を呼び出すのを忘れるのは非常に自然なことです。if一方で、set_menu_varsデータベースへのクエリがそれほど短くないものもあるため、必要な場合 (つまり、問題のビューが実際にレンダリングされる場合) にのみ呼び出されるようにします。

4

1 に答える 1

1

「Rails Way」ではありません。

コントローラーはモデルからメソッドを呼び出します。

モデル (article.rb):

def do_something
 code
end

コントローラー (articles_controller.rb):

def index
 @article = Article.do_something
end

ビュー(記事/index.html.erb)

<%= @article %>

あなたの質問を誤解した場合は申し訳ありません。

于 2012-06-20T13:02:40.233 に答える