Rails: как получить переменную контроллера applcation для моего макета приложения

Я пытаюсь получить переменную, установленную в контроллере приложения, чтобы перейти к макету приложения.

Если я использую:

@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, доступный для макета приложения (каждая страница). Мысли? Должен ли я сделать этот сеанс var?

Update

Основываясь на нескольких других сообщениях, которые я читаю, считается, что лучше всего разместить их в помощнике приложения, а затем вызвать их из макета?

# Application helper
def get_var
   Product.first
end

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

Это а) работает в моем браузере и б) проходит тесты. Это лучшая практика? Есть ли более простой/лучший способ?

Ответы

Ответ 1

Пробовал ли вы before_filter метод, в котором объявлена ​​переменная, чтобы убедиться, что каждый другой контроллер вызывает его и передает переменную в соответствующее представление?

class ApplicationController < ActionController:: Base

before_filter: foo_function

def foo_function
@var =" foo "
конец

конец

Если @var является объектом AR, а не строкой, вы уверены, что правильно определены имя модели и имя столбца?

Ответ 2

Вы пытались реализовать его как helper_method?

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

  def foo
    @var ||= "foo"
  end

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