• Aucun résultat trouvé

Routage des ressources (de base)

Dans le document Apprendre Ruby on Rails (Page 177-181)

Les routes sont définies dans config/routes.rb . Ils sont souvent définis comme un groupe d'itinéraires connexes, en utilisant les resources ou resource méthodes de resource .

resources :users créent les sept itinéraires suivants, tous UsersController aux actions de UsersController :

get '/users', to: 'users#index' post '/users', to: 'users#create' get '/users/new', to: 'users#new' get '/users/:id/edit', to: 'users#edit' get '/users/:id', to: 'users#show' patch/put '/users/:id', to: 'users#update' delete '/users/:id', to: 'users#destroy'

Les noms des actions sont affichés après le # dans le paramètre to ci-dessus. Les méthodes avec ces mêmes noms doivent être définies dans app/controllers/users_controller.rb comme suit:

class UsersController < ApplicationController def index

end

def create end

# continue with all the other methods… end

resources :users, only: [:show]

resources :users, except: [:show, :index]

Vous pouvez afficher tous les itinéraires de votre application à tout moment en exécutant: 5.0 $ rake routes 5.0 $ rake routes # OR $ rails routes

users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy

Pour afficher uniquement les itinéraires mappés sur un contrôleur particulier: 5.0

$ rake routes -c static_pages

static_pages_home GET /static_pages/home(.:format) static_pages#home static_pages_help GET /static_pages/help(.:format) static_pages#help

5.0

$ rake routes -c static_pages

static_pages_home GET /static_pages/home(.:format) static_pages#home static_pages_help GET /static_pages/help(.:format) static_pages#help

# OR

$ rails routes -c static_pages

static_pages_home GET /static_pages/home(.:format) static_pages#home static_pages_help GET /static_pages/help(.:format) static_pages#help

Vous pouvez rechercher dans les itinéraires en utilisant l'option -g . Cela montre toute route qui correspond partiellement au nom de la méthode d'assistance, au chemin de l'URL ou au verbe HTTP:

5.0

$ rake routes -g new_user # Matches helper method $ rake routes -g POST # Matches HTTP Verb POST

5.0

$ rake routes -g new_user # Matches helper method $ rake routes -g POST # Matches HTTP Verb POST # OR

$ rails routes -g new_user # Matches helper method $ rails routes -g POST # Matches HTTP Verb POST

De plus, lorsque vous exécutez le serveur rails en mode développement, vous pouvez accéder à une page Web qui affiche tous vos itinéraires avec un filtre de recherche, priorisé de haut en bas, à <hostname>/rails/info/routes . Il ressemblera à ceci:

Assistant Verbe HTTP Chemin Action du contrôleur

Chemin / URL [Path Match]

chemin_utilisateur OBTENIR /users(.:format) utilisateurs # index POSTER /users(.:format) les utilisateurs # créent new_user_path OBTENIR /users/new(.:format) utilisateurs # new edit_user_path OBTENIR /users/:id/edit(.:format) utilisateurs # modifier chemin_utilisateur OBTENIR /users/:id(.:format) utilisateurs # montrent

PIÈCE /users/:id(.:format) utilisateurs # mise à jour METTRE /users/:id(.:format) utilisateurs # mise à jour EFFACER /users/:id(.:format) les utilisateurs # détruisent

Les routes peuvent être déclarées disponibles uniquement pour les membres (pas les collections) à l'aide de la resource méthode au lieu de resources dans routes.rb . Avec la resource , une route d' index n'est pas créée par défaut, mais uniquement lorsque vous en demandez explicitement une comme ceci:

resource :orders, only: [:index, :create, :show]

Contraintes

Vous pouvez filtrer les routes disponibles à l'aide de contraintes. Il existe plusieurs manières d’utiliser des contraintes, notamment:

contraintes de segment , •

contraintes basées sur les demandes •

contraintes avancées •

Par exemple, une contrainte basée sur la demande pour autoriser uniquement une adresse IP spécifique à accéder à une route:

constraints(ip: /127\.0\.0\.1$/) do get 'route', to: "controller#action" end

Voir d'autres exemples similaires ActionDispatch :: Routing :: Mapper :: Scoping .

Si vous voulez faire quelque chose de plus complexe, vous pouvez utiliser des contraintes plus avancées et créer une classe pour envelopper la logique:

# lib/api_version_constraint.rb class ApiVersionConstraint

def initialize(version:, default:) @version = version @default = default end def version_header "application/vnd.my-app.v#{@version}" end def matches?(request) @default || request.headers["Accept"].include?(version_header) end end # config/routes.rb require "api_version_constraint" Rails.application.routes.draw do

namespace :v1, constraints: ApiVersionConstraint.new(version: 1, default: true) do resources :users # Will route to app/controllers/v1/users_controller.rb

end

namespace :v2, constraints: ApiVersionConstraint.new(version: 2) do resources :users # Will route to app/controllers/v2/users_controller.rb end

end

Un formulaire, plusieurs boutons de soumission

Vous pouvez également utiliser la valeur des balises submit d'un formulaire comme contrainte pour acheminer une action différente. Si vous avez un formulaire avec plusieurs boutons d'envoi (par exemple "preview" et "submit"), vous pouvez capturer cette contrainte directement dans vos routes.rb , au lieu d'écrire du javascript pour changer l'URL de destination du formulaire. Par exemple, avec le gem commit_param_routing, vous pouvez tirer parti de rails submit_tag Rails submit_tag premier paramètre submit_tag vous permet de modifier la valeur de votre paramètre de validation de formulaire

# app/views/orders/mass_order.html.erb

<%= form_for(@orders, url: mass_create_order_path do |f| %> <!-- Big form here -->

<%= submit_tag "Preview" %> <%= submit_tag "Submit" %>

# => <input name="commit" type="submit" value="Preview" /> # => <input name="commit" type="submit" value="Submit" />

... <% end %>

# config/routes.rb resources :orders do

# Both routes below describe the same POST URL, but route to different actions post 'mass_order', on: :collection, as: 'mass_order',

constraints: CommitParamRouting.new('Submit'), action: 'mass_create' # when the user presses "submit"

post 'mass_order', on: :collection,

constraints: CommitParamRouting.new('Preview'), action: 'mass_create_preview' # when the user presses "preview"

# Note the `as:` is defined only once, since the path helper is mass_create_order_path for the form url

# CommitParamRouting is just a class like ApiVersionContraint end

Dans le document Apprendre Ruby on Rails (Page 177-181)

Documents relatifs