代码之家  ›  专栏  ›  技术社区  ›  Joseph Weissman

诊断Rails应用程序挂起元素更新

  •  0
  • Joseph Weissman  · 技术社区  · 15 年前

    在构建帮助小酒店管理预订的Rails应用程序的过程中,我遇到了一个奇怪的应用程序挂起。建立预订可以很好地工作;添加客人、将他们分配到房间等,没有问题。然而,当商人去“确认”一个询问时,Mongrel把我拖出去晾干。

    预订的索引页列出了当前的查询和已确认的预订:

    # reservations/index.html.erb
    
    <% unless @reservations.empty? %>
    <h2>Inquiries</h2><hr/><br/>
    <%= render :partial => 'reservation', :collection => @reservations.reject { |r| r.confirmed } %>
    <h2>Confirmed Reservations</h2><hr/><br/>
    <%= render :partial => 'reservation', :collection => @reservations.reject { |r| not r.confirmed }  %>
    <% else %>
    <%= link_to 'Search for rooms', :action => 'index', :controller => 'search' %>
    <% end %>
    

    在保留部分本身中,调用确认/不确认逻辑的位只是直接链接到控制器操作:

    # _reservation.html.erb
    
    (<% unless reservation.confirmed? %>
        <%= link_to 'Confirm Reservation', :action => 'confirm', :id => reservation.id %>
    <% else %>
        <%= link_to 'Unconfirm Reservation', :action => 'unconfirm', :id => reservation.id %>
    <% end %>)
    

    用于确认预订的控制器操作(映射到“我的路线”中的放置)如下所示:

    def confirm
      puts "\n\n\nConfirming reservation #{params[:id]}..."
      @reservation = Reservation.find(params[:id])
      puts "Found reservation! Confirming..."
      @reservation[:confirmed] = true
      puts "Confirmed, saving..."
      respond_to do |wants|            
        if @reservation.save
          flash[:notice] = 'Reservation has been confirmed.'
          wants.html { redirect_to :action => 'index' }
        else
          wants.html { render :action => 'index' }
        end
      end    
    end
    

    '@reservation.save'就是诀窍所在。每次都有明确的应用程序挂起。

    有人能帮我弄明白这到底是怎么回事吗?

    /更新:

    通过玩控制台,我可以用另一种方式演示这个问题:

    ?> r = Reservation.find(36)
    => #<Reservation id: 36, customer_name: "buyer", customer_email: "buyer@buy.com", begin: "2009-06-22 00:00:00", end: "2009-06-26 00:00:00", request_timestamp: nil, notes: "Thanks!", created_at: "2009-06-13 20:36:50", updated_at: "2009-06-13 20:36:50", yacht_id: 7, adults: 1, children: 0, buyer_id: 3, confirmed: nil>
    >> r.confirmed = true
    => true
    >> r
    => #<Reservation id: 36, customer_name: "buyer", customer_email: "buyer@buy.com", begin: "2009-06-22 00:00:00", end: "2009-06-26 00:00:00", request_timestamp: nil, notes: "Thanks!", created_at: "2009-06-13 20:36:50", updated_at: "2009-06-13 20:36:50", yacht_id: 7, adults: 1, children: 0, buyer_id: 3, confirmed: true>
    >> r.save!
    IRB::Abort: abort then interrupt!!
        from C:/Ruby/lib/ruby/1.8/irb.rb:81:in `irb_abort'
        from C:/Ruby/lib/ruby/1.8/irb.rb:247:in `signal_handle'
        from C:/Ruby/lib/ruby/1.8/irb.rb:66:in `start'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/callbacks.rb:275:in `call'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/callbacks.rb:275:in `run_callbacks'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/callbacks.rb:344:in `callback'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/callbacks.rb:318:in `valid?'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/associations/association_proxy.rb:221:in `send'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/associations/association_proxy.rb:221:in `method_missing'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/validations.rb:906:in `validates_associated'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/validations.rb:906:in `collect'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/validations.rb:906:in `validates_associated'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/validations.rb:399:in `validates_each'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/validations.rb:396:in `each'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/validations.rb:396:in `validates_each'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/callbacks.rb:182:in `call'
     ... 2204 levels...
        from C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/callbacks.rb:90:in `run'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/callbacks.rb:90:in `each'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/callbacks.rb:90:in `send'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/callbacks.rb:90:in `run'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/callbacks.rb:276:in `run_callbacks'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/validations.rb:1029:in `valid_without_callbacks?'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/callbacks.rb:315:in `valid?'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/validations.rb:1018:in `save_without_dirty!'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/dirty.rb:87:in `save_without_transactions!'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:200:in `save!'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:182:in `transaction'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:200:in `save!'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:208:in `rollback_active_record_state!'
        from C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:200:in `save!'
        from (irb):5>>
    

    注意控制台也锁定了,我不得不中止保存!使用ctrl-c的命令。

    世界上为什么会有拯救!这样做了吗?

    /更新:

    知道了!!!!它在我的模型里。我试图验证一个关联,我已经把“很多/属于”倒过来了。

    谢谢大家!

    2 回复  |  直到 10 年前
        1
  •  0
  •   Ryan Oberoi    15 年前

    使用 thin 而不是混血儿。从日志中发布更多详细信息。它通常不会像那样挂着。

        2
  •  1
  •   Sarah Mei    15 年前

    您的问题可能是:

    @reservation[:confirmed] = true
    

    您正在直接更新属性散列,这有点奇怪。通常,您只需更新属性。

    @reservation.confirmed = true
    

    我以前在处理属性散列时遇到过一些奇怪的问题。尤其是胸部——可能是因为发生了某种类型的强迫。