2013-07-28 46 views
0

我试图在我的Rails 3.2.13应用程序中实现用户反馈收集系统。Rails无限循环 - 堆栈级别太深

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

stack level too deep

错误。请让我知道是否有解决方法,或完全更好的方法。这将非常感谢!

这里的痕迹:

Trace of template inclusion: 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... and so on

附:我知道标签不是最好的做法,我现在这样做只是为了更清楚地说明我的方法。

+1

你对渲染发生的时间的假设是错误的。所有的渲染都是在页面第一次渲染时发生的。 –

+0

@johnYeung请添加回溯。 –

回答

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

情景时,我也遇到堆栈级别太深错误。 EG colors.js中的第一行是@export颜色

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

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

0

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