离铁路大约一年,试图通过试验原型来记住一切。我继承了脚手架模板以提供一个Show视图,允许向下钻取到相关的has_many模型。有一些深度嵌套的模型,但我从来没有超过1深,并使用show view向下钻取。
fieldset
show fields from models
actions on model
related action menubar (links to load related records with js)
fieldset
related index view
默认情况下,主要相关模型索引视图从show视图呈现为模板,通常来自相关模型的index.html.erb。使用路由,大多数相关的索引视图也可以在其自己的页面上呈现。我使用这个方案做了大约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上加载默认模板而不使用渲染哈希值,但保持一致。抓了几个小时试图找到其他任何差异。我将participant.html.erb改为部分并将.js行改为
$(“#related”)。html(“&lt;%= escape_javascript(render(:partial =&gt;'events / participant'))%&gt;”);
这有效,没有错误,js和html都工作(participant.html.erb渲染部分)!
自从我开始工作以来,我想我没有其他问题,除了为什么模板与部分的不同行为?或者,还有其他我需要学习的东西吗?
史蒂夫