Rails控制器:是否可以嵌套呈现视图?

时间:2012-02-04 03:11:34

标签: ruby-on-rails controller rendering render

我正在做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

2 个答案:

答案 0 :(得分:2)

我不知道嵌套渲染的确切含义。

情景#1

如果您希望触发操作“索引”但要显示模板“hello.html.erb”,则可以执行

def index
  render :action => :hello
end

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

所以render :action => :hello只是一条捷径。

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

情景#2

如果要渲染该文本,可以在索引方法

中调用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)的默认操作。

请选择适合您的方案(因此我可以从此答案中删除不必要的文字)。

答案 1 :(得分:0)

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

因此,对于上面的结构,您的DemoController应位于

的文件中

应用程序/控制器/ demo_controller.rb

,将呈现的视图将位于以下文件中:

应用程序/视图/演示/ 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>