ruby-on-rails - que - ruby on rails tutorial
Cambie el nombre del parĂ¡metro: id en Recursos de enrutamiento para rieles (4)
Miré a mi alrededor sobre cómo cambiar la ranura dinámica de params y encontré esta publicación que hace exactamente lo mismo. La publicación es http://robots.thoughtbot.com/post/159809070/rails-patch-change-the-name-of-the-id-parameter-in
Básicamente lo que hace es, si lo siguiente son las rutas:
map.resources :clients, :key => :client_name do |client|
client.resources :sites, :key => :name do |site|
site.resources :articles, :key => :title
end
end
Estas rutas crean las siguientes rutas:
/clients/:client_name
/clients/:client_name/sites/:name
/clients/:client_name/sites/:site_name/articles/:title
Una solución es anular el método def to_param
en el modelo, pero quiero def to_param
sin tocar el modelo en sí.
Pero dado que es para Rails 2.x, ¿cómo puedo lograr lo mismo con Rails 3?
Actualizar
Esta aplicación está usando Mongoid. No AR. Entonces, la gema amistosa no se puede usar afaik.
Rieles 4 y 5
En Rails 4, se agregó la opción :param
, que parece hacer exactamente lo que está buscando. Puede echar un vistazo al código de Rails 3 en comparación con el código de Rails 4 .
Detalles
Puede implementar esto fácilmente en su archivo routes.rb
:
# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
A partir del lanzamiento de Rails 4, esta funcionalidad está documentada en las Guías de Rails .
Carriles 3
Desafortunadamente, en Rails 3, se eliminó la opción de la :key
para los resources
, por lo que ya no puede cambiar fácilmente el nombre de las rutas creadas de esta manera con solo pasar una opción adicional.
Detalles
Supongo que de alguna manera ya has conseguido que la aplicación funcione de la manera que deseas el año pasado, pero entraré en una forma de obtener el efecto que describes en Rails 3 en routes.rb
. Simplemente implicará un poco más de trabajo que el método to_param
. Aún puede definir parámetros personalizados en las rutas definidas usando scope
y match
(o sus primos get
, put
, post
y delete
). Simplemente escriba el nombre del parámetro que desea en el marcador:
get ''clients/:client_name'', :to => ''clients#show'', :as => client
scope ''clients/:client_name'' do
get ''sites/:name'', :to => ''sites#show'', :as => site
end
Debería agregar manualmente todas las rutas que los resources
crean automáticamente para usted, pero lograría lo que está buscando. También podría usar efectivamente la opción :controller
con scope
y bloques de scope
adicionales para eliminar parte de la repetición.
EDITAR (8 de mayo de 2014): Haga que sea más obvio que la respuesta contiene información para los Rieles 3 y 4. Actualice los enlaces al código para ir a los números de línea exactos y los compromisos para que funcionen durante un período de tiempo más largo.
EDITAR (16 de noviembre de 2014): Rails 4 debería estar en la cima ahora e incluir información relevante ya que ha sido la versión actual de Rails desde hace bastante tiempo.
EDITAR (9 de agosto de 2016): Refleja que la solución aún funciona en Rails 5 y actualiza los enlaces desactualizados.
Hay una joya para eso, al igual que hay una joya para todo;)
He estado utilizando FriendlyId para este tipo de comportamiento en los rieles 3.
Sin embargo, requerirá que agregue un código a su modelo, como este:
class Client < ActiveRecord::Base
has_friendly_id :name
end
... y si sus clientes no tienen nombres compatibles con URI, es posible que desee utilizar un slug para eso, que puede hacer con has_friendly_id :name, :use_slug => true
. Sin embargo, cuando uses babosas, obviamente necesitarás persistir en la base de datos.
Y como ya se mencionó, aún puede usar el truco to_param
con rieles 3, como se documenta here . Sin embargo, me parece que FriendlyId es un poco más versátil.
Si te entiendo correctamente, lo que quieres es tener el client_name
del client_name
lugar de la id
en tu url, ¿verdad?
Puedes hacerlo anulando el método to_param
en tu modelo. Puede obtener más información here .
en Rails 4, pase la opción param para cambiar los parámetros: id. Por ejemplo, resources :photos, param: :photo_name
generará / photos /: photo_name