2009-06-13 12 views
0

Au cours de la construction d'une application de rails pour aider les petits hôtels à gérer les réservations, je suis confronté à une étrange application. Construire la réservation fonctionne bien; ajouter des invités, les assigner à des pièces, etc., sans problème. Cependant, quand le marchand va «confirmer» une enquête, Mongrel me suspend pour sécher.Diagnostic de Rails Application Mise à jour de l'élément Mise à jour

La page d'index pour les réservations liste les enquêtes en cours et a confirmé les réservations:

# 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 %> 

Dans la réserve elle-même partielle, les bits qui font appel à la confirmation/logique unconfirm sont de simples liens directs à CONTRÔLEUR actions:

# _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 %>) 

L'action du contrôleur pour confirmer une réservation, qui est mis en correspondance avec un PUT dans mes voies, ressemble à ceci:

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' est ce qui fait l'affaire. L'application définie se bloque à chaque fois. Est-ce que quelqu'un peut m'aider à comprendre ce qui se passe ici?

/MISE À JOUR:

De jouer avec la console, je suis en mesure de démontrer la question d'une autre manière:

?> r = Reservation.find(36) 
=> #<Reservation id: 36, customer_name: "buyer", customer_email: "[email protected]", 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: "[email protected]", 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>> 

Notez que verrouillé la console comme bien, et je devais abandonner la enregistrer! commande en utilisant Ctrl-C.

Pourquoi dans le monde serait le sauver! faire ça?

/MISE À JOUR:

Got it !!! C'était dans mon modèle. J'essayais de valider une association et j'avais obtenu le has_many/belongs_to à l'envers.

Merci à tous!

+1

Problème semble être résolu (et la réponse est en ligne dans la question) ... Il ne semble pas que la publication contient réellement assez d'informations pour démontrer le problème - si peu susceptible d'être utile pour d'autres lecteurs. –

Répondre

0

Utilisez thin au lieu de mongrel. Poster plus de détails de votre journal. Il ne pend pas comme ça habituellement.

+0

Je n'ai pas essayé encore mince, mais dans les journaux, il indique: Confirmer la réservation 36 ... Trouvé réservation! Confirmation ... Confirmé, enregistrement ... Et puis rien - la barre d'état des navigateurs se bloque également à 0% chargé.Et sans les instructions puts, le journal s'arrête simplement après l'affichage des informations sur le rendu des réservations/index. –

1

Votre problème peut être le suivant:

@reservation[:confirmed] = true 

Vous mettez à jour directement le hachage des attributs, ce qui est un peu bizarre. Normalement, vous devez simplement mettre à jour l'attribut. J'ai eu des problèmes étranges avant quand j'ai joué avec l'attribut hash. Booléens en particulier - peut-être parce qu'il y a un type de coercition qui se passe.

+0

Merci, mais malheureusement ce n'était pas ça ... –