2017-07-06 4 views
0

Ich arbeite an einem Film Rails Projekt und ich muss die URL umleiten RESTful, aber ich habe keine Ahnung, wie es gemacht wird. Die folgenden Informationen nützlich sein können:[Ruby on Rails] Weiterleitung an RESTful URL

Ich kann nicht: GET /movies when selecting a movie rating should redirect to a RESTful route

Rake Routen:
Prefix Verb URI Pattern Controller#Action root GET / movies#index movies GET /movies(.:format) movies#index POST /movies(.:format) movies#create new_movie GET /movies/new(.:format) movies#new edit_movie GET /movies/:id/edit(.:format) movies#edit movie GET /movies/:id(.:format) movies#show PATCH /movies/:id(.:format) movies#update PUT /movies/:id(.:format) movies#update DELETE /movies/:id(.:format) movies#destroy

The UI of the webpage

einige Beschreibungen von dem, was ich zu tun habe: (sagen im Allgemeinen, wenn der Benutzer löscht absichtlich einige Attribute von der URL, ich habe es auf die richtige URL umleiten):

Um RESTful zu sein, möchten wir die Eigenschaft beibehalten, dass ein URI, der zu einer sortierten/gefilterten Ansicht führt, immer die entsprechenden Sortier-/Filterparameter enthält.

Der Code, den ich die Aufgabe zu tun umgesetzt haben:

if !(params.has_key?(:sort_by)) #check the url has this parameter 
    if session[:sort_by]   #has cookie 
    redirect_to movies_path(:sort_by => session[:sort_by]) #redirect using cookie, not sure need to add :ratings 
    else 
    session[:sort_by] = "id" # default sorting 
    end 
end 

if !(params.has_key?(:ratings)) 
    if session[:ratings] 
    redirect_to movies_path(:ratings => session[:ratings]) # error: AbstractController::DoubleRenderError 
    else 
    session[:rating] = {"G"=>"1", "PG"=>"1", "PG-13"=>"1", "R"=>"1"} 
    end 
end 

: sort_by ist das Attribut zu steuern, wie sich die Filme sortiert, z.B. session[:sort_by] = "date" bedeutet sortiert nach dem Veröffentlichungsdatum.

: ratings sind so etwas wie: "ratings"=>{"G"=>"1", "PG-13"=>"1", "R"=>"1"}

Ein Beispiel URL: /movies?ratings%5BG%5D=1&ratings%5BPG%5D=1&ratings%5BPG-13%5D=1&ratings%5BR%5D=1&sort_by=title

wenn ich so etwas wie .../Filme geben, sollte die URL aus Cookie (falls vorhanden) erzeugt werden. Aber ich habe einige Probleme:
zum Beispiel überprüfen wir, dass sort_by fehlt, und es gibt Sitzung für sort_by, müssen wir noch Sitzung [: Bewertungen] zu movies_path() liefern? Und was ist zu tun, wenn ich das erste Mal auf diese Website komme (keine Sitzung [: Bewertungen]/Sitzung [: sort_by]), aber ich benötige immer noch die RESTful URL (alle aktivierten Kästchen werden standardmäßig angeklickt)

Einige weitere Anweisungen:
Sie sollten also umleiten, wenn Parameter in URL fehlen, anstatt in URL + Sitzung. Das bedeutet, wenn 'sort_by' nicht in der URL, sondern in der Sitzung enthalten ist, sollten Sie diese URL mit Sitzungsdaten ausfüllen und zur vollständigen URL umleiten (also ausfüllen, wenn 'Bewertungen' ebenfalls fehlt). Was nun, wenn ein Parameter sowohl in der URL als auch in der Sitzung fehlt? Sie sollten sich auf einige Initialisierungsregeln verlassen. Bei "Bewertungen" sollten Sie alle Bewertungen überprüfen. und für 'sort_by' können Sie das Schlüsselwort auf 'id' setzen, was bedeutet, dass Elemente standardmäßig sortiert sind (die Reihenfolge der Filme in dem von Movie.all zurückgegebenen Array).

Antwort

0

So etwas sollte

def index 
    session[:sort_by] = if params[:sort_by].present? 
         params[:sort_by] 
         else 
         session[:sort_by] || 'id' 
         end 
    session[:rating] = if params[:rating].present? 
         params[:rating] 
        else 
         session[:rating] || { 'G' => '1', 'PG' => '1', 'PG-13' => '1', 'R' => '1' } 
        end 

    if !(params[:sort_by].present? && params[:rating].present?) 
    redirect_to movies_path(sort_by: session[:sort_by], rating: session[:rating]) 

    return 
    end 
end 

erste paar Zeilen arbeiten, um die Sitzung zu dem Parameterwert einrichten, wenn man in geben wurde, ansonsten prüft, ob einen bestehenden Sitzungswert, und dann auf den Standard fällt zurück.

Dann schauen wir uns an, ob entweder der sort_by- oder der rating -Parameter fehlten, wir werden umleiten, um beide von den neuen Werten in der Sitzung einzuschließen.

Ich glaube, dass dies alle Ihre Kriterien erfüllt.Das Hauptproblem, das Sie hatten, ist, dass, sobald Sie redirect_to aufrufen, es versuchen wird, umzuleiten, es nicht mögen, nachdem Code (besonders andere redirect oder render-Aufrufe) haben. Sie müssen also alle Bedingungen überprüfen, die Sie benötigen, und dann alles in einen Redirect-Aufruf einteilen und dann von der Methode zurückkehren, so dass es nicht versucht, auch zu rendern.