2009-03-29 6 views
4

Ich habe ein Konsistenzproblem mit link_to_remote in Schienen.Problem mit link_to_remote in Schienen

Ich habe 2 Anwendungsfälle von link_to_remote, und sie erzeugen unterschiedliche Ajax. Ich kann nicht herausfinden, warum, und es macht mich verrückt.

Hier Anwendungsfall ein ...

<%= link_to_remote "section-", :update => "sections", :url => {:action => :destroy, :controller => "sections", :id => @section.id } %> 

Dies erzeugt die entsprechende Ajax (wie unten) und arbeitet als ich erwartet. Beachten Sie, dass es den Aktionsparameter aus dem Aufruf aufnimmt und im Ajax korrekt einfügt.

<a href="#" onclick="if { new Ajax.Updater('sections', '/sections/destroy/1', {asynchronous:true, evalScripts:true, parameters:'authenticity_token=' + encodeURIComponent('f5e50e62fafd118e4588b33c9571ea6eef864176')}); }; return false;">section-</a> 

Ich habe auch einen anderen Fall, in dem ich link_to_remote verwenden, aber es erzeugt eine falsche Ajax. Der Anwendungsfall ist nahezu identisch, außer dass der Controller anders ist. Wie auch immer, ich würde nicht erwarten, dass dies zu einem anderen Ajax führt.

Der Aufruf ...

<%= link_to_remote "question-", :update =>"questions-1", :url => {:action => :destroy, :controller => "questions", :id => @question.id} %> 

Das resultierende Ajax ...

<a href="#" onclick="if { new Ajax.Updater('questions-1', '/questions/1', {asynchronous:true, evalScripts:true, parameters:'authenticity_token=' + encodeURIComponent('f5e50e62fafd118e4588b33c9571ea6eef864176')}); }; return false;">question-</a> 

Der offensichtliche Unterschied hier ist, in der zweiten arg zu Ajax.Updater. Der Aktionsparameter fehlt in diesem Pfad. Warum? Dies führt zu einem Code-Bruch für mich, aber ich kann nicht verstehen, warum dies geschieht. Die Aufrufe von link_to_remote sind nahezu identisch.

Bitte zeigen Sie mir in die richtige Richtung. Vielen Dank.

Unten ist mein routes.rb Datei ...


ActionController::Routing::Routes.draw do |map| 
    map.resources :questions, :has_one => :section, :collection => { :sort => :post } 
    map.resources :sections, :has_many => :questions, :has_one => :form, :collection => { :sort => :post } 
    map.resources :forms, :has_many => :sections 

    # You can have the root of your site routed with map.root -- just remember to delete public/index.html. 
    map.root :controller => "forms" 

    map.connect ':controller/:action/:id' 
    map.connect ':controller/:action/:id.:format' 
end 
+0

Können Sie Ihre routes.rb-Datei posten? –

Antwort

2

einfach das Hinzufügen a: method =>: löschen kann Ihren link_to_remote Anruf für Sie die einfachste fix sein:

<%= link_to_remote "question-", :update =>"questions-1", :url => {:action => :destroy, :controller => "questions", :id => @question.id}, :method => :delete %> 

Dies um den Anruf/Fragen/erzwingen sollte: id die HTTP DELETE-Methode zu verwenden. Wenn Sie möchten, dass der obige Aufruf stattdessen die URL/questions/destroy /: id erzeugt, müssten Sie Ihre Routen manuell ändern, da die standard map.resources dieses Ergebnis scheinbar nicht zu erreichen scheint.

+0

Danke. Ja, das löst es. Ich habe das erst heute Morgen entdeckt und bin dann auf deinen Posten gestoßen. –

3

Was bekommen Sie, wenn Sie diese in Ihre Ansicht kopieren?

<%= url_for :action => :destroy, :controller => :questions, :id => @question.id %> 

Ich vermute, dass das Problem mit link_to_remote nicht wirklich ist, aber mit routing. Sobald url_for die von Ihnen erwartete URL zurückgibt, versuchen Sie es erneut mit link_to_remote.

+0

Ich denke du bist richtig und ich bekomme/questions/XX aus deinem obigen Snippet, wenn ich/fragen/destroy/XX bekommen soll. Die Sache ist, ich weiß nicht, wie man dieses Routing-Verhalten beheben kann. Die Zeilen 'map.resources' sehen für Fragen und Abschnitte gleich aus. –