我正在尝试在我的Rails 3.2.13应用程序中实现用户反馈收集系统。
在我的_footer partial(在layouts / application.html.erb文件中呈现)中,我已经包含了如下反馈表:
布局/ _footer.html.erb:
<footer class="footer dropup pull-right">
<nav>
<div id="fat-menu" class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
We'd Love Your Feedback!<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li></li>
<div id="feedback_form">
<%= render 'feedbacks/form' %>
</div>
</ul>
</nav>
</footer>
反馈/ _form.html.erb:
<% @feedback = Feedback.new %>
<%= form_for(@feedback) do |f| %>
<% if signed_in? %>
<%= f.hidden_field :user_id %>
<% end %>
<div class="feedback_text">
<%= f.text_area :text %>
</div>
<div id="submit_feedback"><%= f.submit "Submit", class: "btn btn-primary" %></div>
<% end %>
<script>
$('#submit_feedback').click(function(){
$('#feedback_form').html("<%= escape_javascript(render 'feedbacks/after_submit') %>");
});
</script>
反馈/ _after_submit.html.erb:
<div id="new_feeeback">
Submit a new feedback.
</div>
<script>
$('#new_feeeback').click(function(){
$('#feedback_form').html("<%= escape_javascript(render 'feedbacks/form') %>");
});
</script>
我觉得这样的无限循环对于我的情况是必要的,因为在用户点击适当的点之前不会触发渲染。
但是Rails不会让我这样做,因为我得到了
堆栈级别太深
错误。如果有解决方法或更好的方法,请告诉我。非常感谢!
这是追踪:
模板包含的痕迹: 应用程序/视图/反馈/ _after_submit.html.erb, 应用程序/视图/反馈/ _form.html.erb, 应用程序/视图/反馈/ _after_submit.html.erb, 应用程序/视图/反馈/ _form.html.erb, 应用程序/视图/反馈/ _after_submit.html.erb, 应用程序/视图/反馈/ _form.html.erb, app / views / feedbacks / _after_submit.html.erb ...等等
P.S。我知道标签不是最好的做法,我现在这样做只是为了更清楚地说明我的方法。
答案 0 :(得分:1)
其中一个解决方案可能是使用ajax发送数据并从服务器呈现返回的数据。 更新您的 _form.html.erb :
$('#feedback_form form').on('submit', function(){
$.ajax($(this).attr('action'), {
type: $(this).attr('method'),
data: $(this).serializeArray()
}).done(function(data) {
$('#feedback_form').html(data);
});
return false;
});
并更新您的控制器以返回 _after_submit.html.erb 页面。
答案 1 :(得分:0)
遇到堆栈级别太深的错误时的情景:
1)尝试在自身中包含相同的文件。 EG colors.js里面的第一行是@export colors
2)命名与函数相同的变量。通常在潜意识中,我们倾向于犯这个错误,我们最终会递归调用函数,而不是使用变量并执行某些操作。
以上是对上述问题的回答: 异常不在视图内,而是在控制器中。请检查反馈控制器内部的功能是否有循环。
答案 2 :(得分:0)
换句话说 - ruby在渲染时替换模板的内容,而不是在点击时替换,因此您的表单模板在&lt;%=%&gt;范围内扩展。括号,包括after_submit内容,其中包含&lt;%=%&gt;它扩展为包含表单模板,其中包含&lt;%=%&gt;扩展after_submit,其中包含.....你知道这可能会有什么问题......