html
とjs
の両方に応答するコントローラーがあります。 html
ビューはページ全体(ヘッダーとフッターを含む)をレンダリングしますが、js
は#main
のみを置き換えます。ヘッダーとフッターは別として、どちらの形式も同じコンテンツをレンダリングします。 3つのファイルでこの効果を得ることができます。
_show.html.erb
<div>Content!</div>
show.html.erb
<%= render "show" %>
show.js.erb
$("#main").fadeIn("<%= escape_javascript(render 'show') %>");
これは機能しますが、個別の_show
パーシャルが必要ない場合、私は好みます。残念ながら、これは機能しません:
show.html.erb
<div>Content!</div>
show.js.erb
$("#main").fadeIn("<%= escape_javascript(render 'show') %>");
As Railsは実際のビューではなくshow
パーシャルを探します。
Railsを取得してパーシャルではなくビューファイルを探す方法はありますか?
別のビュー内で部分的ではないビューをレンダリングするのは、厳密にはRails Way™ではありません。現在のソリューションは、おそらくより良い方法であり、珍しいアプローチではありません。部分的な名前がアクションと同じであると奇妙に感じます。
ただし、この場合のようにビューを共有できる場合は、単にレイアウトにすることができます。
これは、少々の驚きの原則に反して、Rails= html
アクションがjs
アクションに対応していない場合、js
テンプレートをレンダリングするという事実によって促進されます。これは、jsテンプレートとパーシャルの両方を削除し、たとえばfadein.js.erb
というタイトルのレイアウトを作成できることを意味します。
# yourviews/show.html.erb
<div>Content!</div>
# layouts/fadein.js.erb
$("#main").fadeIn("<%= escape_javascript(yield) %>");
# YourController.rb
def show
# ...
respond_to do |wants|
wants.html
wants.js { render :layout => "fadein" }
end
end
他の人が述べたように、別のビューで別の非部分ビューをレンダリングすることは「Not Rails way」ですが、それを行うことを主張する場合、1つの方法は次のとおりです。
<%= render :file => '<replace with relative/absolute path>' %>
コメントでわかるように、これは良い習慣ではありません。 Railsにはview、partial、およびlayoutの概念があります。一度だけ使用し続ける必要があります。
コンテキストをrender
メソッドに渡すだけです:
<%= render :template => "show" -%>