0

我正在尝试为我的 Rails 3.2.13 应用程序实现用户反馈收集系统。

在我的 _footer 部分(在 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 不会让我这样做,因为我得到了

堆栈级别太深

错误。请让我知道是否有解决方法或更好的方法。将不胜感激!

这是跟踪:

模板包含的痕迹:app/views/feedbacks/_after_submit.html.erb、app/views/feedbacks/_form.html.erb、app/views/feedbacks/_after_submit.html.erb、app/views/feedbacks/_form.html .erb、app/views/feedbacks/_after_submit.html.erb、app/views/feedbacks/_form.html.erb、app/views/feedbacks/_after_submit.html.erb...等等

PS我知道标签不是最佳实践,我现在这样做只是为了更清楚地说明我的方法。

4

3 回答 3

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页面。

于 2013-07-28T16:59:02.560 回答
0

遇到 Stack Level too deep 错误时的场景:

1) 尝试在其自身中包含相同的文件。EG colors.js 中的第一行是@export colors

2) 将变量命名为与函数相同。通常下意识地,我们倾向于犯这个错误,我们最终会递归地调用一个函数,而不是使用一个变量并执行一些操作。

因此,作为对上述问题的回答:异常不在视图中,而是在控制器中。请检查反馈控制器内部的功能是否存在循环。

于 2013-07-28T19:02:35.037 回答
0

换句话说 - ruby​​ 在渲染时替换模板的内容,而不是在点击时,因此您的表单模板在 <%= %> 括号内展开,其中包括 after_submit 内容,其中包含 <%= %> 扩展为包含表单模板,其中包含一个 <%= %> 扩展 after_submit,其中包含一个.....你看这可能是有问题的......

于 2016-03-24T20:20:23.363 回答