Rails无限循环 - 堆栈级太深

时间:2013-07-28 16:34:59

标签: ruby-on-rails ruby web-applications

我正在尝试在我的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。我知道标签不是最好的做法,我现在这样做只是为了更清楚地说明我的方法。

3 个答案:

答案 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,其中包含.....你知道这可能会有什么问题......