在生产环境中使用Phusion Passanger + Nginx托管我的应用程序时,我遇到了fields_for无法正确渲染大量字段。
示例:
members_controller.rb:
class MembersController << ApplicationController
def new
@member = Member.new
# There are 200 or so groups in the database.
current_client.groups.active.each do |group|
@member.affiliation.build(:group => group)
end
end
end
new.html.haml:
= form_for @member do |f|
= f.text_field :name
= f.text_field :phone
= f.fields_for :affiliations do |affiliation_form|
.group_field
= affiliation_form.hidden_field :group_id
= affiliation_form.label :_destroy, affiliation_form.object.group.name
= affiliation_form.check_box :_destroy, { }, "0", "1"
到目前为止一直很好,在开发过程中,这将按照我的要求正确返回所有字段。在生产服务器上部署应用程序时(同一个ruby 1.9.2p180)。 HTML不完整,大约有30-50左右的200个字段用最后的* .group_field *呈现,没有或存在一些元素(每次都有不同的结果)。
第二个最后一组字段:
<div class="group_field">
<input id="..." name="..." type="hidden" value="48">
<label for="...">...</label>
<input name="..." type="hidden" value="1">
<input id="..." name="..." type="checkbox" value="1">
</div>
上一组字段:
<div class="group_field">
<input id="..." name="..." type="hidden" value="49">
<label for="...">...</label>
</div>
日志没有产生任何错误,所以我无法找出错误/问题所在的位置。我也在生产环境中尝试过相同的表单,只提供20个左右的组,这些组合完全正常。 任何人都可以帮我找出这个非常奇怪的错误吗?
答案 0 :(得分:1)
我几乎可以保证这是由于Rails 3.1 introducing HTTP streaming。尽管该功能具有明显的选择性,但它可能会导致许多问题,这可能是由于ActionView的输出缓冲设施发生了变化,而fields_for
等助手可以利用这些设施。
目前并且主要是由于这一变化,对于Rails 3.1的nginx和乘客支持充其量只是片状。您会发现other, similar questions以切换到Unicorn,Thin或类似内容并从nginx代理结束。