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