2012-02-04 13 views
1

私はLynda.comのレッスンチュートリアルをやっていて、レンダリング( 'methodname')を使ってデフォルトのものよりも別のビューをレンダリングする方法を説明しています。Railsコントローラ:ネストされたビューのレンダリングは可能ですか?

しかし、このレンダリングが「入れ子になっていない」ことに気付きました。たとえば、以下のコードでは、localhost:3000/demo/indexはviews/demo/hello.html.erbにビューを生成し、localhost:3000/demo/helloは '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 

同じアクションで2回レンダリングすることはできません。

Btwは、/demos/indexというべきではなく、ただ/demosです。 resourcesルートのデフォルトアクションはresources :demosです。

あなたに合ったシナリオを選択してください(この回答から不要なテキストを削除できます)。

0

現在、コントローラでレンダリングしようとしていますが、すべてのレンダリングはRailsのビューで処理する必要があります。

したがって、上記のあなたの構造のために、あなたのDemoControllerは

アプリ/コントローラ/ demo_controller.rb

のファイルに配置する必要がありますし、レンダリングされるビューがにあるファイルになります。

app/views/demo/index.htmlERB

アプリ/ビュー/デモ/ _hello.html.erb(リーディングファイル名_hello.html.erbにアンダースコアが、これは別のページ内にレンダリングされる「部分的」であることをレールに示します)

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> 
関連する問題