离开 Rails 大约一年了,并试图通过尝试原型来记住所有内容。我继承了脚手架模板以提供一个显示视图,该视图允许向下钻取到相关的 has_many 模型。有一些深度嵌套的模型,但我从不深入 1 层并使用显示视图向下钻取。
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。使用路由,大部分相关的索引视图也可以呈现在自己的页面上。我使用这个方案做了大约 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 => 'events/participants'))%>");
这有效,没有错误,js 和 html 都有效(participants.html.erb 呈现部分)!
既然我让它工作了,我想除了为什么模板与部分的不同行为之外我没有其他问题?或者,我还有什么需要学习的吗?
史蒂夫