2011-12-23 7 views
7

私が読んでいる本の中で著者がそれについて話す方法のために、「テンプレート」を「レンダリングする」というアイデアについてちょっと混乱しました。Rails:「テンプレートをレンダリングする」のはどういう意味ですか?

"テンプレートをレンダリングする"という私の元来の理解は、Railsが画面上で表示される/ビューアに表示される(部分的なレンダリングの仕方で)コンテンツを提供していることを意味していましたが、 "テンプレートをレンダリングする"という概念を使用しているように見えます。文脈で説明させてください。

この本(実際のレール3)は、従来のlayouts/application.html.erbファイルを使用してページレイアウトを設定し、views/tickets/show.html.erbなどの別の表示ページに「収穫」します。これはまったく簡単です。

このビュー内には、views/tickets/show.html.erbという部分がレンダリングされています(これも簡単な概念です)。

<div id='tags'><%= render @ticket.tags %></div> 

は今、この部分の中に、権限のあるユーザーは、「チケット」から「タグ」を取り除くことができるように設計された「tags_controller.rb」の「削除」メソッドの呼び出しは、AJAXを使用して、そこにあります私たちのモックプロジェクト管理アプリケーションで。今ここに

<% if can?(:tag, @ticket.project) || current_user.admin? %> 
    <%= link_to "x", remove_ticket_tag_path(@ticket, tag), 
     :remote => true, 
     :method => :delete, 
     :html => { :id => "delete-#{tag.name.parameterize}" } %> 
    <% end %> 

(データベース内のチケットからタグの関連付けを解除)タグコントローラ内のアクションを「削除」である...

def remove 
    @ticket = Ticket.find(params[:ticket_id]) 
    if can?(:tag, @ticket.project) || current_user.admin? 
     @tag = Tag.find(params[:id]) 
     @ticket.tags -= [@tag] 
     @ticket.save 
    end 
    end 
end 

この削除アクションの終わりに、著者はもともとrender :nothing => trueを含んでいましたが、彼は「あなたはテンプレートをレンダリングするつもりだから」と言って行動を改訂しました。 ここで私は混乱するでしょう

彼がこのアクションをレンダリングするテンプレートは、 "remove.js.erb"です。その中には1行のjqueryしかありません。 (つまり、ユーザが画面に表示したタグ)を、データベース内のチケットから切り離しました。

$('#tag-<%= @tag.name.parameterize %>').remove(); 

私は、「テンプレートをレンダリング」を読ん私は、アプリケーションがページにコンテンツを挿入することを期待しますが、コントローラで「削除」アクションによってレンダリングされたテンプレートは1つの要素を削除するjqueryの関数を呼び出しますページ。

「テンプレート」が「レンダリング」されている場合は、別のテンプレートを削除して(新しいテンプレートのためのスペースを確保するため)、コンテンツが「レンダリング」されることを期待しています部分がレンダリングされます。この質問にjqueryがある状況で "テンプレート"が "レンダリング"されたときに実際に何が起こっているのかを明確にすることはできますか?それは実際にユーザーの前に新しいページを置いているのですか(私は何らかの物理ページがレンダリングされることを期待していました)

+0

+1よく書かれた質問 – bragboy

答えて

3

あなたはほぼそこにいます!テンプレートをレンダリングすることは、実際には常にコンテンツを作成することですが、コンテンツを少し広げて説明します。それはhtmlのチャンクである可能性があります。たとえば、新しいアイテムを取得するためのajax呼び出しは、新しいアイテムを記述するhtmlを生成するかもしれませんが、そうである必要はありません。

テンプレートは、2番目の例のようにjavascriptを生成することがあります。個人的に私はこれを避け、代わりにJSONをクライアントに渡し、クライアント側が必要な作業を実行できるようにしています。

実行できるレンダリングのもう1つのタイプは、いくつかのJSONを生成することです。 APIはこれをしばしば行いますが、通常のページでもこれを行うことができます。たとえばではなく、あなたはJSON

{ to_delete: "tag-123"} 

をレンダリングして、あなたのjQueryの成功コールバックは、アプリケーションでこれを持っていることによって、DOMから削除するためにどの要素を知るためにそのペイロードを使用している場合がありますxのタグを削除するには、いくつかのJavaScriptをレンダリングします。 JS

$('a.delete_tag').live('ajax:success', function(data){ 
    var selector = '#' + data.to_delete; 
    $(selector).remove() 
} 

はあなたが通常

render :json => {:to_delete => "tag-#{@tag.name.parameterize}"} 
を経由して、これを行うと思いますので、これは、まったく本当にテンプレートではありませんように レンダリングJSON(あなたの削除リンクはクラスのdelete_tag」を持っていたと仮定すると)ファイル

しかし、私はあなたがこれ(私はなぜ想像することはできません)のためのerbテンプレートを使用することができると思います。

+0

これは興味深いことです。あなたは何かを明確にすることはできますか?テンプレートを使用する代わりに、js => "$( '#tag - <%= @ tag.name.parameterize%>')remove();" 。これはうまくいきましたが、タグを削除するためにはページをリフレッシュする必要がありましたが、このjqueryをテンプレートに入れると、タグを削除するためにページを更新する必要はありませんでした。 「あなたのjQueryの成功コールバックで、その要素をDOMから取り除くためにそのペイロードを使用させてください」と書いていると、ページをリフレッシュしなくてもrender:jsを使うことができますか?あなたは説明するか/どのように表示できますか?前もって感謝します。 – Leahcim

+0

私は、レンダリングjsを実行すると、erbタグではなく通常のルビースタイル補間(#{})を期待していると思われます。 –

+0

ありがとうございます。あなたは正しいです。 – Leahcim

2

私の理解では、js.erbはその中のjavascript関数を実行することによってレンダリングされます。非常に多くの場合、以下のようなものが行われている:それはまたActionController::Base#render方法の詳細に入り、あなたがrender :nothingを使用する場合、何が舞台裏で起こるように助けることがhttp://guides.rubyonrails.org/layouts_and_rendering.htmlでレンダリングするのは本当に簡潔な概要は(あります

jQuery(document).ready(function() { 
    jQuery('#element').html('<%= escape_javascript(render pages/content) %>'); 
}); 
+0

ありがとう、この関数では、ページ/コンテンツがhtml要素に入れられていますか? – Leahcim

+0

はい、実際にはhtml.erbによって通常レンダリングされるコンテンツをこのようにレンダリングすることができます – prusswan

1

例えば)。レンダリングされますが、ファイルやインラインコードにも使用できます。従来の意味での「テンプレート」だけでなく、

+0

私はそのページを見ました。具体的にはレンダリング=> "アラート( 'Hello Rails'); "したがって、試してみると、2.2.10で説明したように、テンプレートremove.js.erbからコントローラにjqueryを移動しましたが、要素をクリックしたときに削除を行うためにページを更新する必要がありました。 remove.js.erbにjqueryがある場合、実際にページを更新することなく要素を削除します。類似しているが異なる。 – Leahcim

+0

フレデリック・チュンのコメントを参照してください。なぜこの問題があったのですか? – Leahcim

関連する問題