Mientras que las rutas predeterminadas y los ayudantes generados por resources: :articles
suelen servirle bien, es posible que desee personalizarlos de alguna manera. Rails le permite personalizar prácticamente cualquier parte genérica de los helpers de recursos.
La opción :controller
le permite especificar explícitamente un controlador para utilizarlo en el recurso. Por ejemplo:
resources :photos, controller: 'images'
Reconocerán los paths entrantes que empiezan con /photos
, pero la ruta al controlador de imágenes:
HTTP Verb | Path | Controller#Action | Named Helper |
---|---|---|---|
GET | /photos | images#index | photos_path |
GET | /photos/new | images#new | new_photo_path |
POST | /photos | images#create | photos_path |
GET | /photos/:id | images#show | photo_path(:id) |
GET | /photos/:id/edit | images#edit | edit_photo_path(:id) |
PATCH/PUT | /photos/:id | images#update | photo_path(:id) |
DELETE | /photos/:id | images#destroy | photo_path(:id) |
Utilice
photos_path
,new_photo_path
, etc. para generar rutas de acceso para este recurso.
Para los controladores con espacios de nombres, puede utilizar la notación de directorio. Por ejemplo:
resources :user_permissions, controller: 'admin/user_permissions'
Esto hará que se dirija al controlador Admin::UserPermissions
.
Sólo se admite la notación de directorios. Especificar el controlador con la notación de Constantes de Ruby (por ejemplo,
controller: 'Admin::UserPermissions'
) puede conducir a problemas de enrutamiento y los resultados en una advertencia.
Puede utilizar la opción :constraints
para especificar un formato requerido en el id
implícito. Por ejemplo:
resources :photos, constraints: { id: /[A-Z][A-Z][0-9]+/ }
Esta declaración limita el parámetro :id
para que coincida con la expresión regular suministrada. Por lo tanto, en este caso, el enrutador ya no coincidiría con esta ruta /photos/1
. En su lugar coincidiría con,/photos/RR27
.
Puede especificar una restricción única para aplicar a un número de rutas utilizando el formulario de bloque:
constraints(id: /[A-Z][A-Z][0-9]+/) do
resources :photos
resources :accounts
end
Por supuesto, puede utilizar las limitaciones más avanzadas disponibles en rutas sin-resources en este contexto.
De forma predeterminada, el parámetro
id
no acepta puntos, ya que el punto se utiliza como separador para las rutas formateadas. Si necesitas usar un punto dentro de un:id
agrega una restricción que anula esto - por ejemploid: /[^\/]+/
permite cualquier cosa menos una barra.
La opción :as
le permite anular la denominación normal para los ayudantes de ruta designados. Por ejemplo:
resources :photos, as: 'images'
Reconocerán las rutas entrantes que empiezan con /photos
y enrutarán las solicitudes a PhotosController
, pero usarán el valor de la opción :as
para nombrar a los helpers.
HTTP Verb | Path | Controller#Action | Named Helper |
---|---|---|---|
GET | /photos | photos#index | images_path |
GET | /photos/new | photos#new | new_image_path |
POST | /photos | photos#create | images_path |
GET | /photos/:id | photos#show | image_path(:id) |
GET | /photos/:id/edit | photos#edit | edit_image_path(:id) |
PATCH/PUT | /photos/:id | photos#update | image_path(:id) |
DELETE | /photos/:id | photos#destroy | image_path(:id) |
La opción :path_names
le permite sobre-escribir los segmentos new
y edit
automáticamente en las rutas:
resources :photos, path_names: { new: 'make', edit: 'change' }
Esto haría que el enrutamiento reconozca los paths como:
/photos/make
/photos/1/change
Esta opción no cambia los nombres de los action reales. Los dos paths mostrados seguirían la ruta hacia las acciones
new
y deedit
.Si desea cambiar esta opción de manera uniforme para todas sus rutas, puede utilizar un scope.
scope path_names: { new: 'make' } do
# rest of your routes
end
Puede utilizar la opción :as
para prefijar los ayudantes de ruta designados que Rails genera para una ruta. Utilice esta opción para evitar colisiones de nombres entre rutas utilizando un scope de ruta. Por ejemplo:
scope 'admin' do
resources :photos, as: 'admin_photos'
end
resources :photos
Esto proporcionará ayudantes de ruta tales como admin_photos_path
, new_admin_photo_path
, etc.
Para prefijar un grupo de ayudantes de ruta, utilice :as
con scope
:
scope 'admin', as: 'admin' do
resources :photos, :accounts
end
resources :photos, :accounts
Esto generará rutas como admin_photos_path
y admin_accounts_path
que se asignan a /admin/photos
y /admin/accounts
respectivamente.
El scope de namespaces agregará automáticamente :as, así como los prefijos
:module
y:path
También puede prefijar rutas con un parámetro con nombre:
scope ':username' do
resources :articles
end
Esto le proporcionará URLs como /bob/articles/1
y le permitirá hacer referencia a la parte del nombre de usuario de la ruta de acceso como params[: username]
en los controladores, ayudantes y vistas.
De forma predeterminada, Rails crea rutas para las siete acciones predeterminadas (index
, show
, new
, create
, edit
, update
y destroy
) para cada ruta RESTful en su aplicación. Puede utilizar las opciones :only
y :except
para ajustar este comportamiento. La opción :only
le dice a Rails que cree sólo las rutas especificadas:
resources :photos, only: [:index, :show]
Ahora, una solicitud GET
/photos
tendría éxito, pero una solicitud POST
/photos
(que normalmente se encaminan a la acción create
) fallará.
La opción :except
especifica una ruta o lista de rutas que Rails no debe crear:
resources :photos, except: :destroy
En este caso, Rails creará todas las rutas normales excepto la ruta para destruir (una solicitud DELETE
a /photos/:id
).
Si su aplicación tiene muchas rutas RESTful, use :only
y :except
para generar sólo las rutas que realmente necesita puede reducir el uso de memoria y acelerar el proceso de enrutamiento.
Utilizando el scope, podemos alterar los nombres de ruta generados por los recursos:
scope(path_names: { new: 'neu', edit: 'bearbeiten' }) do
resources :categories, path: 'kategorien'
end
Rails ahora crea rutas a CategoriesController
.
HTTP Verb | Path | Controller#Action | Named Helper |
---|---|---|---|
GET | /kategorien | categories#index | categories_path |
GET | /kategorien/neu | categories#new | new_category_path |
POST | /kategorien | categories#create | categories_path |
GET | /kategorien/:id | categories#show | category_path(:id) |
GET | /kategorien/:id/bearbeiten | categories#edit | edit_category_path(:id) |
PATCH/PUT | /kategorien/:id | categories#update | category_path(:id) |
DELETE | /kategorien/:id | categories#destroy | category_path(:id) |
Si desea definir la forma singular de un recurso, debe agregar reglas adicionales al Inflector:
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular 'tooth', 'teeth'
end
La opción :as
reemplaza al nombre generado automáticamente para el recurso en ayudantes de rutas anidadas. Por ejemplo:
resources :magazines do
resources :ads, as: 'periodical_ads'
end
Esto creará ayudantes de enrutamiento como magazine_periodical_ads_url
y edit_magazine_periodical_ad_path
.
La opción :param
reemplaza al identificador de recurso predeterminado :id
(nombre del segmento dinámico utilizado para generar las rutas). Puede acceder a ese segmento desde su controlador usando params[<: param>]
.
resources :videos, param: :identifier
videos GET /videos(.:format) videos#index
POST /videos(.:format) videos#create
new_videos GET /videos/new(.:format) videos#new
edit_videos GET /videos/:identifier/edit(.:format) videos#edit
Video.find_by(identifier: params[:identifier])
Puede reemplazar ActiveRecord::Base#to_param
de un modelo relacionado para construir una URL:
class Video < ApplicationRecord
def to_param
identifier
end
end
video = Video.find_by(identifier: "Roman-Holiday")
edit_videos_path(video) # => "/videos/Roman-Holiday"