web-dev-qa-db-ja.com

Rails:ビュー内からビューを(部分ではなく)レンダリングします

htmljsの両方に応答するコントローラーがあります。 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を取得してパーシャルではなくビューファイルを探す方法はありますか?

38
nullnullnull

別のビュー内で部分的ではないビューをレンダリングするのは、厳密には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
26
numbers1311407

他の人が述べたように、別のビューで別の非部分ビューをレンダリングすることは「Not Rails way」ですが、それを行うことを主張する場合、1つの方法は次のとおりです。

<%= render :file => '<replace with relative/absolute path>' %>
22
Tikiboy

コメントでわかるように、これは良い習慣ではありません。 Railsにはviewpartial、およびlayoutの概念があります。一度だけ使用し続ける必要があります。

  1. 現在のビュー内に複数の余分なビューをレンダリングできると思う場合、layoutを探している可能性が高いです。
  2. ビューの1つを多くのページでレンダリングする必要があると思う場合は、部分を探しています。
  3. このビューがそのビュー内に1つの追加ビューのみをレンダリングし、そのビューが現在のビュー内にのみレンダリングされる必要がある場合、上記のいずれかを選択またはそのいずれでもない-それだけです、単一のファイルで行きます
10
fotanus

コンテキストをrenderメソッドに渡すだけです:

<%= render :template => "show" -%>
4
GMsoF