Pregunta

Me gustan todas las rutas predeterminadas generadas por map.resources de Rail. Pero, hay casos en los que me gustaría usar un identificador no numérico en mis rutas. Por ejemplo, si una ruta anidada está formada por usuarios y sus artículos, una ruta estándar podría escribirse como tal:

map.resources :users, :has_many => [:articles] # => e.g. '/users/:id/articles/:id'

Sin embargo, hay muchas ventajas / razones para no usar el identificador numérico predeterminado generado por Rails. ¿Hay alguna manera de reemplazar los parámetros predeterminados: id por otro identificador canónico de mi elección sin que resulte en escribir rutas personalizadas para cada acción estándar? Di si quiero una ruta en el siguiente formato:

'/users/:login/articles/:id'

¿Es posible este tipo de rutas utilizando map.resources ?

¿Fue útil?

Solución

A partir de Rails 2.3, no es posible cambiar el nombre del parámetro y seguir utilizando el enrutamiento automático que proporciona #resources .

Como solución alternativa, puede asignar artículos con un : path_prefix y : name_prefix :

map.resources :articles, :path_prefix => "/users/:login",
                         :name_prefix => "user_"

El : path_prefix afecta a la URL, y el : name_prefix afecta a las rutas con nombre generadas, por lo que terminará con estas rutas:

    user_articles GET    /users/:login/articles(.:format)          {:controller=>"articles", :action=>"index"}
                  POST   /users/:login/articles(.:format)          {:controller=>"articles", :action=>"create"}
 new_user_article GET    /users/:login/articles/new(.:format)      {:controller=>"articles", :action=>"new"}
edit_user_article GET    /users/:login/articles/:id/edit(.:format) {:controller=>"articles", :action=>"edit"}
     user_article GET    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"show"}
                  PUT    /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"update"}
                  DELETE /users/:login/articles/:id(.:format)      {:controller=>"articles", :action=>"destroy"}

Sin embargo, como regla general, me atendré a la convención predeterminada de Rails de : user_id , con el enrutamiento que publicaste en tu pregunta. Generalmente se entiende que : id y : user_id no necesariamente implican " identificador numérico " - implican " identificador de recursos, " sea ??lo que sea eso Y al adherirse a la convención predeterminada, su código será más fácil de entender para cualquier persona que haya utilizado rutas de recursos en Rails.

Para usar un identificador no numérico para un recurso, simplemente redefine #to_param en su modelo. Luego, asegúrate de usar un buscador en tu controlador que lo encuentre por este identificador (en lugar del ID numérico), como Usuario # find_by_login! .

Otros consejos

Puede cambiar el valor predeterminado de usar la ID en las URL al reemplazar to_param en su modelo. por ejemplo

class User < ActiveRecord::Base
  def to_param
    login
  end
end

user_articles_path(@user) => "/users/:login/articles"

El único otro cambio que deberá hacer es encontrar usuarios al iniciar sesión en lugar de por ID en sus controladores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top