2017-12-16 4 views
0

Im Moment habe ich eine verschachtelte Routen Associates zwischen meiner Karte und Zeilen, wo eine Zeile has_many Zeilen.Rails verschachtelte Routen falsche ID

resources :maps do 
    resources :rows 
end 

Während die

edit_map_row GET /maps/:map_id/rows/:id/edit(.:format) rows#edit 

in meinem Rechen Routen suchen Dies wird einige Dinge vermasselt, weil, wenn ich die URL aussehen, während eine Zeile bearbeiten, es mir diese URL gibt.

http://localhost:3000/maps/11/rows/1/edit 

Die die Karte ID ist nicht 11, es ist actally 1 und umgekehrt. Wie kann ich dies in meinen Routen ändern, anstatt die map_id als 11 zu verwenden, ist es 1 und die row_id ist eigentlich 11?

Die Route sollte wie folgt aussehen:

edit_map_row GET /maps/:id/rows/:row_id/edit(.:format) rows#edit

Hier die Set-Methoden in meinem Controller sind, wenn das

Karten Controller

private 
    def set_row 
     @row = Row.find(params[:id]) 
    end 

Reihen-Controller

private 
    def set_map 
     @map = Map.find(params[:id]) 
    end 
hilft

Antwort

0

Ihr Routing ist korrekt. Die letzte Controller-ID in Ihren Routen heißt immer id und alle vorhergehenden zeigen den Controllernamen vor der id an.

Ihre Rake-Routen scheinen dann korrekt zu sein.

Es gibt ein Problem, obwohl in einem Ihrer privaten Methode ist:

in Karten-Controller:

private 
    def set_row 
     @row = Row.find(params[:id]) 
    end 

Sie können keine Zeile param hier Ihre Karte Ressourcen haben, ist über Ihre Reihe Ressourcen. Die Route, die zu einer Aktion des Karten-Controllers führt, wird niemals eine Zeile anzeigen.

In der Reihe Controller ist Ihre private Methode auch falsch, dieses Mal beide Karte param und Zeilen param avilable sind aber als Karten Reihen vorhergehenden ist, sollten Sie wie aufrufen werden:

private 
    def set_map 
     @map = Map.find(params[:map_id]) 
    end 

Meine Frage ist: Haben Sie einen Fehler im Moment ausgelöst? Und auch sicherstellen, dass, wenn übergeben Sie einen verschachtelten Pfad in einen link_to Tag wie edit_map_row dass Sie die richtigen IDs in den Klammern passieren:

edit_map_row_path(map_id, row_id) 

MAP_ID und row_idd zu sein, was ihr Name schon sagt butthat Sie können aus einer Variablen zugreifen wie @ map.id etc ...

0

Sie haben nicht wirklich jeden Kontext geteilt, um anzuzeigen, dass Sie irgendetwas Komplexes tun, das den Kampf gegen die Schienenkonvention garantiert.

Die verschachtelten Routen, die Ihnen zugewiesen wurden, sind per Konvention und die Namen der Parameter sind von Entwurf (:map_id für die Karte und :id für die Zeile).In Ihrem aktuellen Code versuchen Sie set_map in RowsController mit dem :id param, wenn es angeblich eine ID ist, die zu einer Zeile gehören sollte, das Objekt, mit dem Sie auf dieser Route arbeiten möchten.

In Ihrer MapsController Ich weiß nicht, warum Sie set_row verwenden müssten (wenn Sie es irgendwo anrufen, teilen Sie bitte). Sie können die Reihen einer Karte immer finden, indem Sie @map.rows anrufen

Ihre Kartenrouten, die den Kartenprüfer treffen, sollten einen :id param haben, der dann zur Identifikation einer Karte gehören würde. Sie haben wahrscheinlich es so haben wollen:

app/controllers/maps_controller.rb

private 
    set_map 
    @map ||= Map.find(params[:id]) 
    end 

Für Ihre Reihen-Controller, wie Sie sehen, es erwartet einen param genannt :map_id, und dann die :id param würde zu einer Reihe gehören.

Sie würden dann so etwas wie dieses:

app/controllers/rows_controller.rb

private 
    def set_map 
    @map ||= Map.find(params[:map_id]) 
    end 

    def set_row 
    @row ||= Row.find(params[:id]) 
    end 

Sie natürlich die set_map und finden Sie die Karte an anderer Stelle mit row.map überspringen könnte.