Ruby on rails 如何将变量传递给布局?
我有两个版本的应用程序布局,只有几行不同。考虑下面的例子:Ruby on rails 如何将变量传递给布局?,ruby-on-rails,ruby,layout,Ruby On Rails,Ruby,Layout,我有两个版本的应用程序布局,只有几行不同。考虑下面的例子: !!! %html %head # a lot of code here %body # some more code here - if defined? flag and flag == true # variant 1 - else # variant 2 问题是,如何将此标志传递给布局 class ApplicationController
!!!
%html
%head
# a lot of code here
%body
# some more code here
- if defined? flag and flag == true
# variant 1
- else
# variant 2
问题是,如何将此标志传递给布局
class ApplicationController < ActionController::Base
layout 'layout', :locals => {:flag => true} #won't work :(
# ...
end
控制器实例变量?这是获取模板信息的正常方法。为了有条件地选择布局,这是怎么回事?好的,所以我自己找到了解决方案:
class ApplicationController < ActionController::Base
layout 'layout'
before_filter :set_constants
def set_constants
@flag = true
end
end
在这些情况下,我通常更喜欢使用helper方法而不是实例变量。下面是一个如何做到这一点的示例:
class ApplicationController < ActionController::Base
layout 'layout'
helper_method :flag
...
protected
def flag
true
end
end
如果您有一个控制器,其中flag不应为true,则只需覆盖该方法:
class PostsController < ApplicationController
...
private
def flag
false # or perhaps do some conditional
end
end
通过这种方式,您可以确保标志辅助对象在视图中始终可用,这样您就不必执行if-defined?或者任何东西,而且,在没有使用布局的情况下,在任何before_过滤器中都不会指定实例变量
它还有助于在视图中保留尽可能少的实例变量。还有两个选项可以执行,即OP实际要求的操作:
1.
在布局中:
- if flag ||= false
# variant 1
- else
# variant 2
在应用程序控制器中,以下是技巧:
layout 'application' # or whatever
在任何类型的控制器中:
render :locals => { :flag => true }
render :locals => { :flag => true }
我的猜测是,由于动态布局定义不是真正的布局定义,布局处理将在稍后发生,这将为本地_分配中的所有键生成必要的方法。因此,实例变量可能是一个性能解决方案。有什么想法吗?请留下评论
2.
您可以只使用局部变量,如:
- if local_assigns[:flag] ||= false
# variant 1
- else
# variant 2
然后在任何控制器中:
render :locals => { :flag => true }
render :locals => { :flag => true }
不要使用flag use@flag您如何尝试设置变量?编辑杰西说的话。在不知道您正在做的其他事情的情况下,我们不得不猜测问题可能是什么。@Dave查看更新的示例。我只想把一个变量标志从控制器传递给布局,我不认为你能把局部变量传递给这样的布局;无论如何,布局只有:only和:except选项,我知道。在不知道条件的性质的情况下,很难给出通用建议,可能有更好的方法。如果要传递多个变量,可以方便地将它们绑定到哈希或对象中,这些变量可以在需要该布局的所有方法中重用。而不是在定义的情况下?flag和flag==true只要说@lite就是我说的,就使用一个控制器实例变量。虽然我很高兴它能起作用,但我不确定这是你自己造成的。@Dave,你说得对,谢谢。我是ruby新手,我花了一些时间才找到它的真正含义,不幸的是,google没有对第一个结果做出明确的解释。你怎么能在一些操作中使用它呢?例如,我只想在'Index'操作上设置为'false'。最简单的方法可能是编写参数[:action]!='根据DanneManne的答案在methodBuilding中建立索引,但有一个名为action_name的可用助手,您可以使用。那么动作名称!='“索引”也会起作用。这和控制器名称都是由rails提供的