Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将变量传递给布局?_Ruby On Rails_Ruby_Layout - Fatal编程技术网

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提供的