2011-09-02 12 views
6

Ho appena aggiornato a Rails 3.1 e un tipico modulo ajax a creare un oggetto modello produce il seguente errore in caso di successo: ActionView::Template::Error (undefined method gsub' for #<ActionDispatch::Flash::FlashHash:0x00000102b73b78>):Rails 3.1 Modulo AJAX - "ActionView :: Template :: Errore (metodo non definito` gsub 'per # <ActionDispatch :: Flash :: FlashHash: 0x00000102b73b78>): "

L'azione di creazione sta andando bene, i dati vengono inviati al database, ma la pagina non cambia e js non viene eseguita. il js funziona se c'è un errore, producendo il messaggio di errore come previsto .... Quindi solo il successo sta producendo l'errore e non riuscendo a eseguire il js.

Ecco il mio codice:

Controller:

def create 
    @contact = Contact.new(params[:contact]) 
    respond_to do |format| 
    if @contact.save 
     flash[:notice] = "Welcome!" 
     format.html 
     format.js 
    else 
     format.html { render 'pages/home'} 
     format.js 
    end 
    end 
end 

forma vista

<div id="contact_notice"></div> 
<%= form_for @contact, :remote => true do |f| %> 
    <%= f.text_field :email, :id => 'email', 'data-default' => 'Sign up to join the beta!' %><%= f.submit "Submit", :id => 'submit' %> 
<% end %> 

/views/contacts/create.js.erb

<% if @contact.errors.any? %> 

// Create errors 
var errors = $('<div class="flash notice"></div>'); 
<% @contact.errors.full_messages.each do |error| %> 
    errors.append('<%= escape_javascript(error) %>'); 
<% end %> 

// Display errors 
$("#contact_notice").html(errors); 

<% else %> 

// Display success (clearing any errors) 
$("#contact_notice").html('<div class="flash notice"><%=escape_javascript(flash.delete(:notice)) %></div>'); 
<% end %> 

Ed ecco il stack trace quando un nuovo contatto è salvato:

Rendered contacts/create.js.erb (0.6ms) 
Completed 500 Internal Server Error in 13ms 

ActionView::Template::Error (undefined method `gsub' for #<ActionDispatch::Flash::FlashHash:0x000001042b1970>): 
12: <% else %> 
13: 
14: // Display success (clearing any errors) 
15: $("#contact_notice").html('<div class="flash notice"><%= escape_javascript(flash.delete(:notice)) %></div>'); 
16: 
17: <% end %> 
app/views/contacts/create.js.erb:15:in `_app_views_contacts_create_js_erb__3535867194219445180_2168748520' 
app/controllers/contacts_controller.rb:6:in `create' 

Fammi sapere se riesci a vedere cosa mi manca qui. Grazie mille.

+0

puoi pubblicare lo stacktrace che Rails genera sulla console o nel registro quando si ottiene l'errore? –

+0

Sì qui: Contatti resi/create.js.erb (0.6ms) Completato 500 Errore interno server in 13 ms ActionView :: Template :: Errore (metodo non definito 'gsub 'per # ): 12: <% else %> 13: 14: // display successo (compensazione eventuali errori) . 15: $ ("# contact_notice") html ('

<%= escape_javascript(flash.delete(:notice)) %>
'); 16: 17: <% end %> app/views/contatti/create.js.erb: 15: in '_app_views_contacts_create_js_erb__3535867194219445180_2168748520' app/controllers/contacts_controller.rb: 6: in' creare' – tuddy

+0

Si consiglia di posizionare che nel vostro OP, è difficile da leggere qui e altri potrebbero voler vederlo. –

risposta

9

Rails ha cambiato il modo in cui alcune cose funzionano in 3.1, da quello che ho capito Rails 3.1 non sta utilizzando Hash per il FlashHash e lo stanno ora basando su Enumerable. Here is an answer che va più in dettaglio. Si dovrebbe essere in grado di utilizzare:

flash.discard(:notice) 

Al posto del vecchio:

flash.delete(:notice) 
+0

bizzarro! grazie mille, l'ha risolto – tuddy

+0

Fantastico, buona fortuna con la tua app. –

Problemi correlati