2011-09-02 11 views
6

Właśnie zaktualizowałem Rails 3.1 i typowy formularz ajax do Utworzenie obiektu modelu powoduje następujący błąd: ActionView::Template::Error (undefined method gsub' for #<ActionDispatch::Flash::FlashHash:0x00000102b73b78>):Rails 3.1 Formularz AJAX - "ActionView :: Szablon :: Błąd (niezdefiniowana metoda` gsub 'dla # <ActionDispatch :: Flash :: FlashHash: 0x00000102b73b78>): "

Działanie tworzenia przebiega prawidłowo, dane są przesyłane do bazy danych, ale strona się nie zmienia, a js nie jest wykonywane. js działa, jeśli wystąpił błąd, generując komunikat o błędzie zgodnie z oczekiwaniami ... Więc tylko sukces powoduje błąd i nie wykonuje js.

Oto mój kod:

Kontroler:

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 

widok forma

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

A oto śledzenie stosu, gdy nowy kontakt jest Zapisano:

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' 

Daj mi znać, jeśli możesz zobaczyć, czego tu brakuje. Dziękuję.

+0

można opublikować StackTrace że Rails generuje na konsoli lub w dzienniku, gdy pojawi się błąd? –

+0

Tak tutaj: Renderowane kontakty/create.js.erb (0.6ms) Zakończono 500 Błąd wewnętrznego serwera w 13ms ActionView :: Szablon :: Błąd (niezdefiniowana metoda 'gsub 'dla # ): 12: <% else %> 13: 14: // Wyświetlacz sukces (kasowanie błędów) . 15: $ ("#") contact_notice html ('

<%= escape_javascript(flash.delete(:notice)) %>
'); 16: 17: <% end %> app/views/Kontakt/create.js.erb: 15: w '_app_views_contacts_create_js_erb__3535867194219445180_2168748520' app/controllers/contacts_controller.rb: 6:' tworzyć” – tuddy

+0

może chcesz umieścić, że w OP, trudny do odczytania tutaj, a inni mogą chcieć go zobaczyć. –

Odpowiedz

9

Szyny zmieniły sposób, w jaki niektóre rzeczy działają w wersji 3.1, z tego co rozumiem, Rails 3.1 nie używa już Hash dla FlashHash i teraz opierają go od Enumerable. Here is an answer który jest bardziej szczegółowy. Powinieneś być w stanie używać:

flash.discard(:notice) 

Zamiast starego:

flash.delete(:notice) 
+0

dziwaczne! wielkie dzięki, to naprawiło. – tuddy

+0

Niesamowite, powodzenia w korzystaniu z aplikacji. –

Powiązane problemy