0

在构建 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 %>)

确认预订的控制器操作(映射到我的路线中的 PUT)如下所示:

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 命令。

为什么世界上会保存!正在这样做吗?

/更新:

知道了!!!它在我的模型中。我试图验证一个关联,但我已经得到了 has_many/belongs_to 的东西。

谢谢大家!

4

2 回答 2

1

你的问题可能是这样的:

@reservation[:confirmed] = true

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

@reservation.confirmed = true

当我弄乱属性哈希之前,我遇到了奇怪的问题。尤其是布尔值 - 也许是因为发生了某种类型的强制。

于 2009-06-14T03:55:57.513 回答
0

使用薄而不是杂种。从您的日志中发布更多详细信息。它不只是像通常那样挂起。

于 2009-06-13T23:53:34.867 回答