2017-06-18 2 views
3

In einem Standard, rüstet Rails 5.1 (oder 5.0) -Controller, erhalten Sie diese auf der erstellen Aktion:Rails Javascript Anfrage reagiert, obwohl format.js ist nicht auf Controller

def create 
    @test = Test.new(test_params) 

    respond_to do |format| 
     if @test.save 
     format.html { redirect_to @test, notice: 'Test was successfully created.' } 
     format.json { render :show, status: :created, location: @test } 
     else 
     format.html { render :new } 
     format.json { render json: @test.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Wie Sie sehen, gibt ist kein format.js da.

Aber wenn Sie remote: true zum Formular hinzufügen (oder, in Rails 5.1, können Sie die local: true entfernen, die den neuen Standard verwenden, die über Ajax schreiben ist), das Formular funktioniert: der Browser einen Beitrag über xhr senden und Umleitung auf den neu erstellten Datensatz.

an Entwickler-Tools der Suche, ich sehe, dass die Antwort für die Formulareinreichung eine 200 OK mit folgendem Inhalt war:

Turbolinks.clearCache() 
Turbolinks.visit("http://localhost:3000/tests/10", {"action":"replace"}) 

Console auch zeigt es verarbeitet wurde von Javascript: Started POST "/tests" for 127.0.0.1 at 2017-06-18 09:38:25 -0300 Processing by TestsController#create as JS

Die Die Frage ist dann: Wie behandelt Rails diese Antwort/Weiterleitung für die JS-Anfrage, wenn es keine format.js in der Steuerung gibt?

Ich bin alles in Rails Magie, aber ich möchte wissen, wie das funktioniert, und ich habe nicht gesehen 'Fallback die JS-Anfrage an den format.html Block' dokumentiert überall.

Antwort

1

Es sieht so aus, als käme der Code, der diese Antwort generiert, von der turbolinks-rails gem.

https://github.com/turbolinks/turbolinks-rails/blob/v5.0.1/lib/turbolinks/redirection.rb#L14

aus dem verknüpften Code es wie turbolinks sieht bereitet eine js Antwort, wenn redirect_to genannt wird, ist die Anforderung XHR, kein GET Anfrage und turbolinks: false wurde nicht an den redirect_to Aufruf zur Verfügung gestellt.

Turbolinks überschreibt ActionController redirect_to, wenn der Edelstein vorhanden ist und app.config.turbolinks.auto_include truthy ist.

def redirect_to(url = {}, options = {}) 
    turbolinks = options.delete(:turbolinks) 

    super.tap do 
    if turbolinks != false && request.xhr? && !request.get? 
     visit_location_with_turbolinks(location, turbolinks) 
    else 
     if request.headers["Turbolinks-Referrer"] 
     store_turbolinks_location_in_session(location) 
     end 
    end 
    end 
end 
0

Dieses Verhalten ist beabsichtigt und umgesetzt von ActionView::LookupContext:

https://github.com/rails/rails/blob/master/actionview/lib/action_view/lookup_context.rb#L251

# Override formats= to expand ["*/*"] values and automatically 
# add :html as fallback to :js. 
def formats=(values) 
    if values 
    values.concat(default_formats) if values.delete "*/*".freeze 
    if values == [:js] 
     values << :html 
     @html_fallback_for_js = true 
    end 
    end 
    super(values) 
end 

Es gibt eine offene PR dieses Verhalten zu ändern, aber es ist ein Abwürgen jetzt:

https://github.com/rails/rails/pull/15224

Es gab einige Diskussionen über diese andere PR:

https://github.com/rails/rails/pull/5892

Verwandte Themen