1

約1年間レールから離れ、プロトタイプで実験してすべてを覚えようとしています. 関連する has_many モデルにドリルダウンできる Show ビューを提供するために、scaffold テンプレートを継承しました。いくつかの深くネストされたモデルがありますが、1 つ以上の深さには決して行かず、show ビューを使用してドリルダウンします。

fieldset
    show fields from models
    actions on model
related action menubar (links to load related records with js)
fieldset
    related index view

デフォルトでは、主要な関連モデルのインデックス ビューは、多くの場合、関連モデルの index.html.erb から、show ビューからテンプレートとしてレンダリングされます。ルーティングを使用すると、関連するインデックス ビューのほとんどを独自のページに表示することもできます。このスキームを使用して約 8 つのモデルを実行しましたが、最後に試したモデルではActionView::Template::Error (stack level too deep):、.js テンプレートを何百回も読み込もうとしてエラーが発生し、.js ファイルで要求されたテンプレートを読み込めませんでした。

Started GET "/events/2/participants" for 127.0.0.1 at 2012-11-21 05:39:56 -0600
Processing by EventsController#participants as JS
  Parameters: {"id"=>"2"}
  Event Load (0.1ms)  SELECT "events".* FROM "events" WHERE "events"."id" = ? LIMIT 1  [["id", "2"]]
  Rendered events/participants.js.erb (0.2ms)
  Rendered events/participants.js.erb (1.9ms)
  ...  
  Rendered events/participants.js.erb (486.2ms)
  Rendered events/participants.js.erb (487.6ms)
Completed 500 Internal Server Error in 496ms

ActionView::Template::Error (stack level too deep):
  activesupport (3.2.8) lib/active_support/notifications/instrumenter.rb:23

動作中のコントローラー アクションと .js 行:

def stages
  @commitment = Commitment.find(params[:id])
  @stages = @commitment.stages.page(params[:page]).per(10)
  respond_to do |format|
    format.js 
    format.html {render :template => "stages/index"}
  end
end

<stages.js.erb>
$("#related").html("<%= escape_javascript(render(:template => 'stages/index'))%>");

.js ファイルがステージ ビューからテンプレートをレンダリングすることに注意してください。

問題を引き起こしたコントローラーの同じもの:

def participants
  @event = Event.find(params[:id])
  @participants = @event.participants
  respond_to do |format|
    format.js 
    format.html {render :template => "events/participants"}
  end
end

<participants.js.erb>
$("#related").html("<%= escape_javascript(render(:template => 'events/participants'))%>");

唯一の違いは、インデックスがイベント ビューにあることです (参加者ビュー/コントローラーはありません)。デフォルトのテンプレートは、format.html のレンダー ハッシュなしで読み込まれますが、一貫性を保つために残されています。

他の違いを見つけようとして数時間頭を悩ませた後。私はparticipants.html.erbを作成し、.js行を次のように変更しました

$("#related").html("<%= escape_javascript(render(:partial => 'イベント/参加者'))%>");

それはうまくいきました、エラーはありません、jsとhtmlの両方が機能します(participants.html.erbは部分的にレンダリングします)!

私はそれを機能させたので、テンプレートとパーシャルの動作が異なる理由以外に質問はないと思いますか? または、他に学ぶ必要があることはありますか?

スティーブ

4

0 に答える 0