Rails 5 Routing Cookbook: 10 rețete pentru dezvoltatorul Rails începător și nu numai

Trebuie să țineți cont de faptul că Rails este un framework cu opinii și că unul dintre principiile sale de bază este convenția în locul configurației. Acest lucru înseamnă că, cu excepția cazului în care aveți un motiv foarte bun, nu ar trebui să încălcați niciunul dintre modelele și convențiile de denumire de mai sus.

De exemplu, dacă aș decide să codific acțiunea de indexare ca get 'cars/index' sau acțiunea de creare ca post 'car/create', acest lucru ar încălca comportamentul Rails out-of-the-box pentru metode de ajutor cum ar fi form_for, link_to și redirect_to.

Consecința încălcării convențiilor fără intenție este haosul și produce o dezordine încâlcită care vă va face să vă luptați cu cadrul ore în șir.

Fotografie de Daniele Levis Pelusi pe Unsplash

Rute de resurse singulare

Este de asemenea posibil să aveți rute pentru resurse singulare, adică resurse care pot fi căutate fără a specifica un :id, cum ar fi cele care se aplică la un current_user sau current_account. Acest lucru poate fi realizat prin utilizarea resurselor singulare încorporate de Rails.

resource :profile 

Rute înglobate

Câteodată avem nevoie să înglobăm resurse în interiorul altor resurse. De exemplu, dacă vreau să creez o rezervare pentru o anumită mașină din garajul meu, ar putea fi mai convenabil să preiau :id pentru acea mașină din URL decât un câmp ascuns al formularului, care ar putea fi manipulat de un utilizator rău intenționat. Modul în care creăm resurse imbricate în rails este următorul:

resources :cars do 
resources :bookings
end

Aceasta creează toate cele șapte acțiuni CRUD pentru rezervările imbricate în mașini. De obicei, însă, nu aveți nevoie de toate cele șapte rute. Și chiar și atunci când aveți nevoie, cu siguranță nu toate trebuie să fie aninate. Să spunem că ceea ce avem nevoie este acțiunea de creare a unei rezervări (vom presupune că formularul de creare a unei rezervări locuiește în acțiunea de prezentare a mașinii) și de modificare și actualizare a unei rezervări existente. Trebuie să știu :idde o mașină pentru a edita/actualiza o rezervare? Răspunsul este evident că nu. Prin urmare, vreau ca aplicația mea să răspundă la următoarele URL-uri:

# to CREATE a booking
POST request to http://my-ruby-garage.com/cars/:id/bookings/create# to EDIT a booking
GET request to http://my-ruby-garage.com/bookings/:id/edit# to UPDATE a booking
PATCH request to http://my-ruby-garage.com/bookings/:id/

Care sunt generate de următorul cod:

resources :cars do 
resources :bookings, only:
end
resources :bookings, only:

Rails ne permite să modificăm care dintre rutele CRUD standard ar trebui să fie generate, furnizând o matrice de simboluri sau un singur simbol la opțiunea :only sau opusul acesteia :except.

Rutele non-CRUD

Nu suntem limitați la cele șapte rute de resurse CRUD. De asemenea, putem specifica rute care se aplică unei singure resurse (rute de membru) sau mai multor resurse (rute de colecție).

Rute de membru

Continuând cu exemplul nostru RubyGarage, mașinile pot fi parcate în garaj sau pot fi scoase din garaj. Să ne imaginăm că avem acțiuni de controler care sunt capabile să efectueze aceste acțiuni care modifică un anumit atribut al unei mașini specifice.

resources :cars do 
member do
patch :park
patch :remove
end
end

Cele de mai sus ne permit să trimitem cereri de patch-uri către http://my-ruby-garage.com/cars/:id/park și http://my-ruby-garage.com/cars/:id/remove și să găsim mașina specifică în controler înainte de a modifica resursa în consecință.

Rute de colecție

În același mod, uneori dorim să efectuăm anumite acțiuni asupra mai multor resurse în același timp. De exemplu, poate că trebuie să parcăm și să eliminăm o colecție de mașini deodată. Putem folosi următorul cod:

resources :cars do 
collection do
post :park, as: :bulk_park
post :remove, as: :bulk_remove
end
end

Aici, configurăm aplicația noastră pentru a răspunde la http://my-ruby-garage.com/cars/park și http://my-ruby-garage.com/cars/remove și, respectiv, numim aceste acțiuni bulk_park și bulk_remove. Amintiți-vă că putem utiliza căi numite pentru a genera căile URL în interiorul aplicației noastre. Pentru a construi o cale de legătură pentru a parca o colecție de mașini, am putea folosi:

<%= link_to "Park Cars", bulk_park_path, method: :post, class: "button" %>

Namespaced Routes

Namespaced routes prefixează calea URL a resurselor din interiorul blocului namespace și va încerca să localizeze controlorii relevanți sub un modul cu același nume ca și namespace-ul. Utilizările tipice pentru acest model sunt spațiile de nume admin și spațiile de nume api.

namespace :factory do 
resources :cars
end

Acest exemplu construiește următoarele rute:

Prefix Verb URI Pattern Controller#Action factory_cars GET /factory/cars(.:format) factory/cars#index
POST /factory/cars(.:format) factory/cars#create factory_car GET /factory/cars/:id(.:format) factory/cars#show
PATCH /factory/cars/:id(.:format) factory/cars#update
PUT /factory/cars/:id(.:format) factory/cars#update
DELETE /factory/cars/:id(.:format) factory/cars#destroy

Și controlorul ar trebui să fie și el namespaced :

class Factory::CarsController < ApplicationController
# ...
end

Scoped Routes

Metoda scope ne permite să rămânem DRY și să grupăm împreună regulile de rutare aferente. Atunci când este utilizată fără opțiuni, este similară cu namespace, dar controlorii relevanți nu trebuie să fie asociați printr-un namespace cu un modul.

scope :factory do 
resources :cars
end

Generează următoarele rute:

Prefix Verb URI Pattern Controller#Action factory_cars GET /factory/cars(.:format) cars#index
POST /factory/cars(.:format) cars#create factory_car GET /factory/cars/:id(.:format) cars#show
PATCH /factory/cars/:id(.:format) cars#update
PUT /factory/cars/:id(.:format) cars#update
DELETE /factory/cars/:id(.:format) cars#destroy

Scope suportă trei opțiuni: module, path și as.

Să spunem că avem un asistent în mai mulți pași pentru a crea o mașină nouă în fabrică, care este gestionat de un controlor care locuiește într-un modul wizards. Dorim ca ruta să apară în browser ca http://my-ruby-garage.com/create-a-car și să putem face referire la această rută în interiorul aplicației noastre ca create_car. Există un modul Wizard::Car care cunoaște fiecare pas al expertului.

scope module: 'wizards', path: 'create-a-car', as: 'create_car' do
Wizard::Car::STEPS.each do |step|
get step, to: "cars##{step}"
end
post :validate-step, to: 'cars#validate_step'
end

Codul de mai sus creează același model pentru fiecare pas. De exemplu, pasul 1 este accesibil în browser prin URL-ul http://my-ruby-garage.com/create-a-car/step1, formularul său corespunzător trimite o cerere de postare la http://my-ruby-garage.com/create-a-car/validate-step, iar calea poate fi invocată prin apelarea create_car_step1_path.

Rute Redirecționări

Rails ne permite, de asemenea, să facem redirecționări direct în routes.rb. În exemplul precedent, poate că vreau ca oricine aterizează pe http://my-ruby-garage.com/create-a-car să fie redirecționat automat către primul pas. Acest lucru poate fi realizat cu următorul cod:

get 'create-a-car', 
to: redirect("/create-a-car/#{Wizard::SpotAccount::STEPS.first}")

Route Defaults

Puteți defini parametrii impliciți într-un traseu trecând un hash pentru opțiunea :defaults.

resources :cars do
collection do
get :export, defaults: { format: 'csv' }
end
end

Utilizând acest lucru, vizitarea http://my-ruby-garage.com/cars/export va apela acțiunea de export din controlerul de mașini și acțiunea controlerului corespunzător va răspunde cu un csv în mod implicit.

Route Globbing

Utilizând segmente wildcard (fragmente prefixate cu o stea), putem specifica faptul că părțile rămase dintr-un traseu trebuie să corespundă unui anumit parametru. Acest lucru se numește „route globbing”.

get '/rent/*slugs', to: 'cars#index', as: :rent_cars

Acest traseu s-ar potrivi cu http://my-ruby-garage.com/rent/lisbon/suv-sedan și ar seta parametrii la „lisbon/suv-sedan”. Acest lucru ar putea fi apoi folosit într-un sistem de căutare sau filtrare în baza noastră de date pentru a găsi mașini în Lisabona de tip suv sau sedan.

Scriu o gemă Slugcatcher cu această funcționalitate în minte pentru a marca modelele Rails care pot fi căutate ca și route slugs.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.