1

在使用 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

新的.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 是不完整的,在 200 个字段中大约有 30-50 个左右呈现,最后一个 *.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 个左右的组,效果很好。谁能帮我找出这个非常奇怪的错误?

4

1 回答 1

1

我几乎可以保证这是由于 Rails 3.1引入了 HTTP 流。尽管该功能具有明显的选择加入性质,但它似乎引起了许多问题,这可能是由于 ActionView 的输出缓冲设施的变化,而帮助者喜欢fields_for利用这些设施来充分利用这些设施。

目前,主要由于这一变化,Rails 3.1 的 nginx 和乘客支持充其量是不稳定的。您会发现其他类似的问题,这些问题以切换到UnicornThin或类似的东西并从 nginx 代理结束。

于 2011-09-20T08:56:14.777 回答