Digamos que tengo una aplicación de blogs Ruby on Rails con un modelo Post. Por defecto, podrías leer las publicaciones de http://.../post/id
. He añadido una ruta
map.connect ':title', :controller => 'posts', :action => 'show'
que aceptará http://.../title
(los títulos son únicos) y el controlador hará una consulta para el título y mostrará la página. Sin embargo, cuando ahora estoy llamando a en una vista, Rails aún me da enlaces del tipo post / id.
¿Es posible hacer que Rails cree automáticamente los enlaces bonitos para mí en este caso?
Si está dispuesto a aceptar: http: /…/ 1234-title-text puede simplemente hacer:
def to_param [id, title.parameterize].join("-") end
AR::Base.find
ignora el bit después del ID, por lo que “simplemente funciona”.
Para hacer que / title desaparezca, intente nombrar su ruta:
map.post ':id', :controller => 'posts', :action => 'show', :conditions => {:id => /[0-9]+-.*/ }
Asegúrese de que esta ruta aparezca después de cualquier map.resources :posts
call.
Puede anular el método to_param de ActiveRecord y hacer que devuelva el título. Al hacerlo, no necesita hacer su propia ruta para ello. Solo recuerda a URL codificarlo.
Lo que podría ser una mejor solución es echar un vistazo a lo que The Ruby Toolbox tiene para ofrecer cuando se trata de enlaces permanentes . Creo que usar uno de estos será mejor que arreglarlo tú mismo a través de to_param.
Usaría una columna de la base de datos de permalink, una ruta, y normalmente omito el uso de link_to a favor de tags de anclaje html más rápidas.
Configurando tu ruta como:
map.connect '/post/:permalink', :controller => 'post', :action => 'show'
luego en el show de posts_controller:
link = params[:permalink] @post = Post.find_by_permalink(link)
Tu enlace sería entonces
Link
luego en su método de creación, antes de guardar, para generar el enlace permanente
@post = Post.new(params[:post]) @post.permalink = @post.subject.parameterize if @post.save #ect
Hay una gem para que hagas esto perfectamente