2010-04-04 7 views
6

entiendo cómo crear una URL personalizada en los carriles con el fin de traducir http://mysite.com/forum/1 en http://mysite.com/some-forum-name¿Cómo implementar urls de vanidad anidadas "cortas" en rieles?

Pero me gustaría ir un paso más allá y obtener el siguiente trabajo (si es posible):

en lugar de: http://mysite.com/forum/1/board/99/thread/321

me gustaría en el primer paso para llegar a algo como esto: http://mysite.com/1/99/321

y en última instancia tienen como si fuera http://mysite.com/some-forum-name/some-board-name/this-is-the-thread-subject.

¿Esto es posible?

+0

enrutamiento de recursos, enrutamiento anidada, y el enrutamiento de poca profundidad todos van a tener el nombre del recurso en el camino, por lo si solo desea ids o algún nombre de foro en la ruta, deberá realizar un enrutamiento regular, probablemente con parámetros acotados. – Corey

Respuesta

2
+0

eso es lo que he estado leyendo, pero parece que no puedo entender a partir de los ejemplos disponibles y las descripciones lo que debería conducir a los resultados que estoy buscando. ¿Es nidificante superficial? :¿tiene muchas? O usando map.connect y comodines (que algunas personas dicen que no deberías usar) ... un poco buscando una pista en la dirección correcta aquí. – UnSandpiper

1

tal vez intentar algo así como

map.my_thread ':forum_id/:board_od/:thread_id.:format', :controller => 'threads', :action => 'show' 

Y luego, en su controlador tiene

@forum = Forum.find(params[:forum_id]) 
@board = @forum.find(params[:board_id]) 
@thread = @board.find(params[:thread_id]) 

Tenga en cuenta que usted puede tener que model_id ser cualquier cosa (el nombre en este caso)

En su ver, puede usar

<%= link_to my_thread_path(@forum, @board, @thread) %> 

Espero que esto ayude

5

Para que este trabajo "muy bien" con los ayudantes de URL Rieles usted tiene que anular to_param en su modelo:

def to_param 
    permalink 
end 

Dónde permalink es generado por tal vez un before_save

before_save :set_permalink 

def set_permalink 
    self.permalink = title.parameterize 
end 

La razón por la que crea un enlace permanente es porque, eventualmente, tal vez, potencialmente, tendrá un título que no es compatible con las URL. Ahí es donde entra parameterize.

Ahora, en cuanto a encontrar esas publicaciones basadas en lo que permalink es, puede ir por la ruta fácil o la ruta difícil.

ruta fácil

Definir to_param ligeramente diferente:

def to_param 
    id.to_s + permalink 
end 

seguir utilizando Forum.find(params[:id]) donde params[:id] sería algo como 1-my-awesome-forum. ¿Por qué esto todavía funciona? Bueno, Rails llamará al to_i en el argumento pasado al find, y llamando al to_i en esa cadena devolverá simplemente 1.

ruta duro

Dejar to_param la misma.Recurrir al uso de find_by_permalink en sus controladores, utilizando params[:id] que se transmite en forma de las rutas:

Model.find_by_permalink(params[:id]) 

Ahora viene la parte divertida

Ahora usted quiere tomar el recurso de la URL. Bueno, es un enfoque Sisípico. Claro que podría dejar de usar los ayudantes de enrutamiento Ruby on Rails ofrece como map.resources y definirlos usando map.connect pero ¿realmente vale la pena esa ganancia? ¿Qué "súper poderes especiales" te otorga? Ninguno, me temo

Pero aún si se quería hacer eso, aquí hay un gran lugar para comenzar a partir de:

get ':forum_id/:board_id/:topic_id', :to => "topics#show", :as => "forum_board_topic" 
Cuestiones relacionadas