Rails: как получить переменную контроллера applcation для моего макета приложения - PullRequest
14 голосов
/ 04 декабря 2010

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

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

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

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

Ответы [ 2 ]

21 голосов
/ 04 декабря 2010

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

класс ApplicationController
before_filter: foo_function

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

конец

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

1 голос
/ 04 декабря 2010

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

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

  def foo
    @var ||= "foo"
  end

  def foo=(val)
    @var = val
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...