【问题标题】:Rhodes Rhomobile - Override the layout behavior for a particular viewRhodes Rhomobile - 覆盖特定视图的布局行为
【发布时间】:2026-01-18 08:55:01
【问题描述】:

对于一个非常具体的案例,我需要一些帮助。

我想覆盖特定视图的布局行为。 我确实找到了描述该怎么做的罗德文档。 (本文底部粘贴了一份 Rhodes 文档)

我尝试使用第二种选择(“调用控制器上的布局方法以覆盖默认布局名称”),但没有奏效。 我想我可能误解了如何对控制器进行编码,或者希望只有语法错误...... 在下面查看有关该应用程序的更多信息。

谁能告诉我应该怎么做? 什么是正确的语法? 还是我应该使用其他方法?

提前致谢。

路易斯·德申斯

以下是有关该应用程序的一些信息以及我所做的:

  • 简单应用
  • 构建适用于 iPhone
  • 应用程序在“计算器”视图中启动
  • “计算器”视图调用“控制”视图调用“帮助”视图
  • 应用结构:

    app/
    ->  index.erb                        (Control view)  
    ->  layout.erb                       (Standard layout)  
    ->  calculatorlayout.erb             (Customize layout for Calculator view)  
    ->  calculator/  
    ----->    index.erb                  (Calculator view)  
    ----->    calculator_controller.erb  (Controller to be able to override layout)  
    ->  help/  
    ----->    index.erb                  (Help view)
    
  • 我创建了 Calculator_controller.erb 包含

    require 'rho/rhocontroller'
    
    require 'helpers/browser_helper'
    
    class CalculatorController < Rho::RhoController
    
    include BrowserHelper
    
    layout :calculatorlayout (Thats what  Rhodes doc mentionned to do)
    
  • 正如我所说,这不起作用。请告诉我正确的做法。

  • 注意:作为临时措施,我将 app/calculatorlayout.erb 复制到 app/calculator/layout.erb 当应用程序在“计算器”视图中启动时,这会正确呈现, 但是如果我导航到“关于”视图并返回到“计算器”视图,则计算器的呈现是使用标准布局完成的。

--------罗德文档---------------------- -------

如果您想覆盖或自定义布局行为,您可以 使用以下参数调用渲染函数:

渲染 :action => 'index', :layout => 'mycustomlayout', :use_layout_on_ajax => false

第一个参数是你想要渲染的动作。接下来是 (可选)布局名称,假定应用程序根为基础 目录。在上面的例子中,Rhodes 会寻找一个名为 应用程序根目录中的“mycustomlayout.erb”(您也可以 使用 :layout => false 禁用布局模板)。这 use_layout_on_ajax 参数告诉 Rhodes 是否使用 Ajax 调用的布局(默认为 false)。

您可以调用控制器上的布局方法来覆盖 默认布局名称:

布局:mycustomlayout

这将强制渲染调用使用 mycustomlayout.erb 代替 此控制器所有操作的默认布局文件。


【问题讨论】:

    标签: layout rhomobile rhodes


    【解决方案1】:

    在控制器中,你需要指定一个动作方法。操作的render 方法是处理layout 属性的方法。您不能简单地为整个控制器指定布局。下面是一个示例控制器文件。然后你需要一个index.erb 视图文件来对应index 操作方法。

    CalculatorController.rb

    require 'rho/rhocontroller'
    require 'helpers/browser_helper'
    
    class CalculatorController < Rho::RhoController
        include BrowserHelper
    
        def index
            # perform any logic or fetch objects for the index.erb view
    
            render :action => :index, :layout => 'calculatorLayout'
        end
    
    end
    

    【讨论】:

      【解决方案2】:

      不幸的是,Rhodes 拥有可怕的文档,因此其机制可能难以破译。但我必须提到,不幸的是,Geoffrey 在这一点上是完全错误的:

      您不能简单地为整个控制器指定布局

      实际上,您可以简单地为控制器指定一个布局。有很多方法,但具体而言,您可以按照文档中提到的那样做,而不是像“ideschenes”那样尝试。如果您检查 render.rb 中的源代码,您会注意到 RhoController 为此确切目的定义了一个 setter 方法,这是一个基本的 Ruby 机制。

      def self.layout(name)
        @layout = name
      end
      

      因此,您可以在控制器内部使用self.layout = :layout_name@layout = :layout_name 来定义默认布局。我不知道如何覆盖它的复杂性,但这种技术将允许您为任何控制器设置默认布局。我自己测试过。

      RhoController 中还有一个方法可以检索布局名称,如果您想自定义选择布局的行为,当然可以在自己的控制器中覆盖它。

      def self.get_layout_name
        @layout.nil? ? 'layout' : @layout
      end
      

      【讨论】: