2010-12-04 6 views
14

애플리케이션 컨트롤러에 변수 세트를 가져 와서 애플리케이션 레이아웃을 버블 링하려고합니다.레일 : 애플리케이션 컨트롤러 변수를 내 애플리케이션 레이아웃으로 가져 오는 방법

내가 사용하는 경우 :

@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> 
... 

내 브라우저에서 작동하며 b) 테스트에 통과했습니다. 그것은 최선의 관행인가? 더 쉽고/좋은 방법이 있습니까?

답변

19

변수가 선언 된 메소드를 before_filter 시도하여 다른 컨트롤러가 변수를 호출하고 해당 뷰에 변수를 전달했는지 확인 했습니까?

클래스와 ApplicationController이 < ActionController :: 자료는

before_filter : foo_function이

데프 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

정말로 레이아웃 파일에만 필요하면 두 가지 모두 괜찮습니다. 방법의 특성에 따라 다르지만, 매우 복잡한 프로젝트가 아니라면 큰 문제는 아닙니다. 개인적으로 나는 응용 프로그램 컨트롤러에 다른 사람들을 유지하면서 응용 프로그램 도우미에 출력 형식 지정 메서드와 그 종속 메서드를 넣을 것입니다. – PeterWong

관련 문제