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