2010-12-04 46 views
14

我试图在应用程序控制器中设置一个变量,以便将应用程序布局调整为最佳状态。Rails:如何获取应用程序布局的应用程序控制器变量

如果我使用:

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

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

回答

19

您是否尝试过before_filter声明变量的方法以确保每个其他控制器都调用它并将该变量传递给它们相应的视图?

类ApplicationController中<的ActionController ::基地

的before_filter:foo_function

DEF foo_function
@var = “foo” 的


如果@var是一个AR对象而不是字符串,你确定你有正确定义的模型名称和列名称?

+0

变量正在设置w/o before_filter。事实上,如果我将它们设置为全局变量,应用程序布局可以看到它们。但a)我试图避免全局性和b)我的基本功能测试不知道他们(出于某种奇怪的原因) – jmccartie 2010-12-04 01:55:02

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 2010-12-04 03:15:49