que me gustaría a mi página web tienen URL con este aspecto:Pretty (fecha) URL de descanso en los carriles
example.com/2010/02/my-first-post
tengo mi modelo Post
con slug
campo ('mi primer post') y published_on
campo (del cual deduciremos las partes de año y mes en la url).
Quiero que mi modelo Post
sea RESTful, por lo que cosas como url_for(@post)
funcionan como deberían, es decir: deberían generar la url antes mencionada.
¿Hay alguna manera de hacerlo? Sé que debe anular to_param
y tener map.resources :posts
con :requirements
conjunto de opciones, pero no puedo hacer que todo funcione.
Lo tengo casi hecho, estoy 90% allí. Usando resource_hacks plugin puedo lograr esto:
map.resources :posts, :member_path => '/:year/:month/:slug',
:member_path_requirements => {:year => /[\d]{4}/, :month => /[\d]{2}/, :slug => /[a-z0-9\-]+/}
rake routes
(...)
post GET /:year/:month/:slug(.:format) {:controller=>"posts", :action=>"show"}
y en la vista:
<%= link_to 'post', post_path(:slug => @post.slug, :year => '2010', :month => '02') %>
genera adecuada enlace example.com/2010/02/my-first-post
.
me gustaría que esto funcione también:
<%= link_to 'post', post_path(@post) %>
Pero necesita reemplazando el método to_param
en el modelo. Debería ser bastante fácil, excepto por el hecho de que to_param
debe devolver String
, no Hash
como me gustaría.
class Post < ActiveRecord::Base
def to_param
{:slug => 'my-first-post', :year => '2010', :month => '02'}
end
end
Resultados en can't convert Hash into String
error.
Esto parece ser ignorado:
def to_param
'2010/02/my-first-post'
end
, que resultará en un error: post_url failed to generate from {:action=>"show", :year=>#<Post id: 1, title: (...)
(que asigna erróneamente objeto @post a la tecla: el año). No tengo ni idea de cómo hackearlo.
Las rutas genéricas (map.connect, de las que habla Ryan Bates), named_routes y RESTful routes son tres cosas diferentes. Puedo obtener fácilmente cualquier URL que desee utilizando rutas genéricas y con nombre. Quiero tener URL bonitas usando rutas RESTful. –