【问题标题】:Rails controller: Is nested rendering of views possible?Rails 控制器:可以嵌套渲染视图吗?
【发布时间】:2024-01-15 05:23:01
【问题描述】:

我正在学习 Lynda.com rails 教程,他们解释了如何使用 render('methodname') 渲染另一个视图而不是默认视图。

但是,我注意到此渲染不是“嵌套”的。例如,在下面的代码中,localhost:3000/demo/index 将在 views/demo/hello.html.erb 中生成视图,而 localhost:3000/demo/hello 将呈现文本“Hello there”。

有没有办法进行“嵌套”渲染,即在此示例中请求演示/索引会返回“Hello there”?

(另外,嵌套渲染的一些用例会很好。我只是出于好奇而问。)

class DemoController < ApplicationController
  def index
     render ('hello')            
  end

  def hello
    render(:text => 'Hello there')
  end

end

【问题讨论】:

    标签: ruby-on-rails controller rendering render


    【解决方案1】:

    我不知道你所说的嵌套渲染到底是什么意思。

    场景 #1

    如果您希望触发操作“index”但要显示模板“hello.html.erb”,您可以这样做

    def index
      render :action => :hello
    end
    

    这将呈现模板 app/views/demos/hello.html.erb(或其他格式,如果你想要它(即在 url 中指定它))。

    所以render :action =&gt; :hello 只是一个捷径。

    您也可以使用render :template =&gt; "hello.html.erb"render :file =&gt; Rails.root.join("app/views/demos/hello.html.erb")(有时很有用)。

    场景 #2

    如果你想渲染那个文本,你可以在 index 方法中调用 hello 方法

    def index
      hello
    end
    

    如果您不希望运行 hello 操作中的其他内容,可以将其与其他方法分开,如下所示:

    def render_hello
      render :text => "Hello world"
    end
    
    def index
      # some other stuff going on...
      render_hello
    end
    
    def hello
      # some other stuff going on...
      render_hello
    end
    

    你不能在同一个动作中渲染两次。

    顺便说一句,网址不应该是/demos/index,而应该是/demos。 索引是resources 路由 (resources :demos) 的默认操作。

    请选择适合你的场景(这样我就可以从这个答案中删除不必要的文字)。

    【讨论】:

      【解决方案2】:

      您当前正尝试在控制器中进行渲染,所有渲染都应在 Rails 中的视图中处理。

      所以对于您上面的结构,您的 DemoController 应该位于

      的文件中

      app/controllers/demo_controller.rb

      并且将呈现的视图将位于以下位置的文件中:

      app/views/demo/index.html.erb

      app/views/demo/_hello.html.erb(文件名 _hello.html.erb 前面的下划线向 Rails 表明这是要在另一个页面中呈现的“部分”)

      在 index.html.erb 文件中,您可以调用 hello.html.erb 文件的渲染。您生成的代码应如下所示:

      demo_controller.rb

      class DemoController < ApplicationController
      
        def index          
        end
      
      end
      

      index.html.erb

      <%= render 'demo/hello' %>
      

      _hello.html.erb

      <p>Hello there</p>
      

      【讨论】: