tutorial rails que ejemplos curso aprender ruby-on-rails ruby ruby-on-rails-3

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