2016-03-20 6 views
1

Ich aktualisiere meine Formularfelder dynamisch mit AJAX basierend auf Auswahlen aus anderen ausgewählten Feldern. Alles funktioniert gut beim ersten Eintrag. Obwohl ich nach dem Absenden des Formulars mit Validierungsfehlern und der Verwendung von 'Neu' Rendering einen Routingfehler erhalte. Ich habe die Route für update_players über Ressourcen hinzugefügt (siehe unten). Ich glaube, mit meinen Routen stimmt etwas nicht.Keine Route stimmt mit [GET] nach Postvalidierungsfehler überein Rails 4

Das war mein Hinweis: https://kernelgarden.wordpress.com/2014/02/26/dynamic-select-boxes-in-rails-4/

config/routes.rb:

geharkt Routen:

... 
    update_players GET /games/update_players(.:format) games#update_players 
      games GET /games(.:format)    games#index 
       POST /games(.:format)    games#create 
     new_game GET /games/new(.:format)   games#new 
     edit_game GET /games/:id/edit(.:format)  games#edit 
      game GET /games/:id(.:format)   games#show 
       PATCH /games/:id(.:format)   games#update 
       PUT /games/:id(.:format)   games#update 
       DELETE /games/:id(.:format)   games#destroy 
... 

games_controller.rb

def show 
    @game = Game.find(params[:id]) 
    end 

    def new 
    @users = User.all 
    @game = Game.new 
    end 

    def create 
    @game = Game.new(game_params) 
    if @game.save 
     flash[:success] = 'Game Saved!' 
     redirect_to current_user 
    else 
     flash.now[:alert] = 'Game did not save' 
     @users = User.all 
     render 'new' 
    end 
    end 
... 
    def update_players 
    @users = Group.find(params[:group_id]).users 
    respond_to do |format| 
     format.js 
    end 
    end 

Vermögenswerte/Javascripts/games.coffee:

update_players = -> 
    $.ajax 'update_players', 
    type: 'GET' 
    dataType: 'script' 
    data: { 
     group_id: $("#groups-select option:selected").val() 
    } 
    error: (jqXHR, textStatus, errorThrown) -> 
     console.log("AJAX Error: #{textStatus}") 
    success: (data, textStatus, jqXHR) -> 
     console.log("Dynamic player select OK!") 

$(document).on 'ready page:load', update_players 
$(document).on 'change', '#groups-select', update_players 

views/Spiele/update_players.js.coffee:

$("#players-select").empty() 
    .append("<%= escape_javascript(render(:partial => "players_in_group_list")) %>") 

Nach 'neuen' Rendering auf erstellen Dies ist der Fehler, den ich erhalte:

Started GET "/update_players?group_id=1&_=1458493122921" for ::1 at 2016-03-20 10:58:43 -0600 

ActionController::RoutingError (No route matches [GET] "/update_players"): 

SOLUTION POSTED UNTER

Antwort

0

LÖSUNG:

ich einen absoluten Pfad für die Ajax-URL zu verwenden, benötigt. Da ich in meiner Ajax-URL einen relativen Pfad 'update_players' verwendet habe, hat rails zuvor games/ für die neue Aktion, aber nicht für die create-Aktion verwendet. Die Routen blieben gleich.

aktualisiert assets/Javascripts/games.coffee:

update_players = -> 
    $.ajax '/games/update_players', 
    type: 'GET' 
    dataType: 'script' 
    data: { 
     group_id: $("#groups-select option:selected").val() 
    } 
    error: (jqXHR, textStatus, errorThrown) -> 
     console.log("AJAX Error: #{textStatus}") 
    success: (data, textStatus, jqXHR) -> 
     console.log("Dynamic player select OK!") 

$(document).on 'ready page:load', update_players 
$(document).on 'change', '#groups-select', update_players 

Danke Зелёный für mich zu senden, den richtigen Weg

2

Nach Ihren Routen sollte die URL in ajax sein:

update_players = -> 
    $.ajax 'games/update_players', 
    type: 'GET' 
    dataType: 'script' 
    data: { 
     group_id: $("#groups-select option:selected").val() 
    } 
    error: (jqXHR, textStatus, errorThrown) -> 
     console.log("AJAX Error: #{textStatus}") 
    success: (data, textStatus, jqXHR) -> 
     console.log("Dynamic player select OK!") 

$(document).on 'ready page:load', update_players 
$(document).on 'change', '#groups-select', update_players 

Oder Ihre Routen ändern:

get 'update_players', to: 'games#update_players' as: 'update_players' 

Ajax:

update_players = -> 
     $.ajax 'update_players',  
    type: 'GET' 
    dataType: 'script' 
    data: { 
     group_id: $("#groups-select option:selected").val() 
    } 
    error: (jqXHR, textStatus, errorThrown) -> 
     console.log("AJAX Error: #{textStatus}") 
    success: (data, textStatus, jqXHR) -> 
     console.log("Dynamic player select OK!") 

$(document).on 'ready page:load', update_players 
$(document).on 'change', '#groups-select', update_players 

auch fix die Zitate:

$("#players-select").empty().append("<%= escape_javascript(render(:partial => 'players_in_group_list')) %>") 
+0

nach unten Das gibt mir ein besseres Verständnis, obwohl nicht ganz das Problem beheben . Weil der $ .ajax Aufruf in Spielen passiert.coffee es preppts Spiele/auf die Route beim ersten Eintrag. Noch einmal, bei einem Fehler (nach dem Rendern von 'neu'), wird mir die fehlende Route '/ update_players' nicht mehr vorangestellt. Wenn ich dem Ajax-Aufruf 'games /' hinzufüge, funktioniert es nach dem Fehler, aber nicht beim ersten Eintrag. Das Ändern der Route zu 'get' update_players ', wie' update_players '' gibt mir den Routing-Fehler: 'Missing: Controller-Schlüssel bei der Routen-Definition'. Danke auch, dass Sie das Zitatproblem verstanden haben! – devinruppert

+0

Verwenden Sie 'get 'update_players', um: 'Spiele # update_players' als: 'update_players'' zu beheben' Missing: Controller-Schlüssel auf Routen Definition' –

+0

Das behebt 'Missing: Controller-Schlüssel auf Routen def' und ermöglicht die Route zu arbeiten nach dem Formular übermittelt, aber funktioniert nicht auf den ersten Eintrag mit diesem Fehler: 'ActiveRecord :: RecordNotFound (Konnte Spiel mit 'ID' = update_players nicht finden): app/controllers/games_controller.rb: 10: in' show''. .. Seltsam; nach dem Rendern von 'new' versucht es 'GamesController # show as JS' zu spielen ... Aktualisiert die oben genannte" games_controller.rb "um die show def anzuzeigen. – devinruppert

Verwandte Themen