Ruby on rails Rails:如何将application控制器变量添加到我的应用程序布局中

Ruby on rails Rails:如何将application控制器变量添加到我的应用程序布局中,ruby-on-rails,Ruby On Rails,我正在尝试在应用程序控制器中设置一个变量,以便在应用程序布局中显示 如果我使用: @var = 'foo' …应用程序布局不知道我在说什么 如果我使用全局变量 $var = 'foo' 。。。应用程序布局工作正常。但是,我的功能测试不起作用: # application layout # my var is an AR object $var.name # Stock functional test class HomeControllerTest < ActionControlle

我正在尝试在应用程序控制器中设置一个变量,以便在应用程序布局中显示

如果我使用:

@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是AR对象
$var.name
#股票功能测试
类HomeControllerTest
我需要这个变量可用于应用程序布局(每个页面)。思想?我需要将此设置为会话变量吗

更新 根据我正在阅读的其他几篇文章,将它们放在应用程序助手中,然后从布局中调用它们是否被认为是最佳实践

# Application helper
def get_var
   Product.first
end

# Application layout
<% @var = get_var %>
<!DOCTYPE html>
<html lang="en">
<head>
...
#应用程序助手
def get_var
产品优先
结束
#应用程序布局
...

a)在我的浏览器中工作,b)通过测试。这是最佳实践吗?有更简单/更好的方法吗?

在过滤声明变量的方法之前,您是否尝试过该方法,以确保其他控制器调用该方法并将变量传递给相应的视图

类ApplicationController
前\u过滤器:foo\u函数

def foo_函数
@var=“foo”
结束

结束


如果@var是AR对象而不是字符串,那么您确定已正确定义了模型名和列名吗?

您是否尝试将其作为
helper\u方法实现

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

  def foo
    @var ||= "foo"
  end

  def foo=(val)
    @var = val
  end
end
class ApplicationController
变量的设置不带前置过滤器。事实上,如果我将它们设置为全局变量,应用程序布局可以看到它们。但是a)我试图避免全局变量,b)我的基本功能测试对它们一无所知(出于一些奇怪的原因),这比将它们放在应用程序助手中有什么好处?我知道,通过这样做,它可以从任何地方调用,但在这种情况下,我所需要的是它对应用程序布局可用。如果您确实只需要在布局文件中使用它,则两者都可以。这取决于方法的性质,但这不是什么大问题,除非你有一个极其复杂的项目。就我个人而言,我会将输出格式化方法及其依赖方法放在应用程序助手中,而将其他方法放在应用程序控制器中。