2010-12-04 9 views
14

アプリケーションコントローラに変数セットを取得しようとしていますが、アプリケーションレイアウトにバブルアップしています。Rails:アプリケーションレイアウトにアプリケーションコントローラ変数を取得する方法

私が使用している場合:

@var = 'foo' 

私はグローバル変数

$var = 'foo' 

を使用している場合は...アプリケーションのレイアウトは、私がおよそ

を話しているか知っていません。..アプリケーションレイアウトが動作します。しかし、私の機能テストはうまくいかない:

# application layout 
# my var is an AR object 
$var.name 

# Stock functional test 
class HomeControllerTest < ActionController::TestCase 
    test "should get index" do 
    get :index 
    assert_response :success 
    end 
end 

# test:functionals 
ActionView::Template::Error: undefined method `name' for nil:NilClass 

私はアプリケーションレイアウト(すべてのページ)で利用できるこのvarが必要です。思考?これをセッションにする必要がありますか?私が読んでいるいくつかの他の記事に基づいて更新

は、それはその後、アプリケーションヘルパーにこれらを配置したレイアウトからそれらを呼び出すためのベストプラクティスと考えていますか?

# Application helper 
def get_var 
    Product.first 
end 

# Application layout 
<% @var = get_var %> 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
... 

このa)は私のブラウザで動作し、b)テストに合格します。それはベストプラクティスですか?より簡単で良い方法がありますか?

答えて

19

変数が宣言されているメソッドをbefore_filterしようとしましたが、他のコントローラがそれを呼び出すのを確認し、変数を対応するビューに渡しますか?

クラスApplicationControllerに< ActionController ::ベース

before_filter:foo_function

DEF foo_function
@var = "foo" という


@varである場合ARオブジェクトではなく、文字列では、モデル名と列名が正しく定義されていることを確認してください。

+0

変数はbefore_filterなしで設定されています。実際、アプリケーションのレイアウトは、グローバル変数として設定すると表示されます。しかし、私はグローバルを避けようとしています。b)私の基本的な機能テストでは、何らかの奇妙な理由のためにそれらのことが分かりません。 – jmccartie

1

helper_methodとして実装しようとしましたか?

class ApplicationController < ActionController::Base 
    helper_method :foo, :foo= 

    def foo 
    @var ||= "foo" 
    end 

    def foo=(val) 
    @var = val 
    end 
end 
+0

これはアプリケーションヘルパーでの利点です。そうすれば、どこからでも呼び出すことができますが、この場合、アプリケーションレイアウトで利用できるようにするだけです。 – jmccartie

+0

本当にレイアウトファイルに必要な場合は、両方ともOKです。それはメソッドの性質に依存しますが、非常に複雑なプロジェクトがなければ大したことではありません。個人的には、アプリケーション・ヘルパーに出力書式設定メソッドとその依存メソッドを置いて、アプリケーション・コントローラーに他のものを保持します。 – PeterWong

関連する問題