2012-02-04 97 views
1

我在做Lynda.com的rails教程,他們解釋瞭如何呈現另一個視圖,而不是使用render('methodname')的默認視圖。Rails控制器:可以嵌套渲染視圖嗎?

但是,我注意到這個渲染不是「嵌套」的。例如,在下面的代碼中,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

我不知道你到底是通過嵌套渲染的意思。

方案1

如果你想行動「指數」被觸發,但模板「hello.html.erb」中顯示,你可以做

def index 
    render :action => :hello 
end 

,這會使得模板app/views/demos/hello.html.erb(或其他格式,如果你想要它(即在url中指定它))。

所以render :action => :hello只是一個捷徑。

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

方案2

如果你想呈現的文本,你可以叫你好指數法

def index 
    hello 
end 

裏面方法如果你不想從打招呼動作其他的東西,是運行你可以將它分開爲其他方法,如下所示:

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 

在同一個動作中不能渲染兩次。

順便說一句,url不應該說/demos/index,但只是/demos。 索引是resources路由(resources :demos)的默認操作。

請選擇適合您的場景(以便我可以從此答案中刪除不必要的文本)。

0

你當前正在嘗試在控制器中渲染,所有的渲染應該在Rails中的視圖中處理。

因此,對於您的結構之上,你DemoController應該

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

位於一個文件,要呈現將在位於文件的意見:

app/views/demo/index.html。ERB

應用程序/視圖/演示/ _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>