0

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

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

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

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

提前致谢。

路易斯·德申斯

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

  • 简单的应用
  • 构建适用于 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 这在应用程序在“Caculator”视图中启动时正确呈现,但如果我导航到“About”视图并返回在“计算器”视图中,计算器的渲染是使用标准布局完成的。

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

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

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

第一个参数是您要呈现的操作。接下来是(可选的)布局名称,它假定应用程序根目录作为基本目录。在上面的示例中,Rhodes 将在应用程序根目录中查找名为“mycustomlayout.erb”的文件(您也可以使用 :layout => false 来禁用布局模板的使用)。use_layout_on_ajax 参数告诉 Rhodes 是否在 Ajax 调用中使用布局(默认为 false)。

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

布局:mycustomlayout

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


4

2 回答 2

0

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

计算器控制器.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
于 2011-12-21T14:32:24.973 回答
0

不幸的是,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
于 2013-09-03T07:23:11.893 回答