2011-11-18 30 views
12

Empecé a jugar con Ruby on Rails y tuve un problema al vincular otra acción en un controlador desde una vista particular. Estoy casi seguro de que es un problema (o falta de código) en mi archivo routes.rb, pero creo que estoy malinterpretando exactamente cómo funciona este archivo & lo que tengo que hacer. Tengo una solución, pero estoy bastante seguro de que no es la "mejor manera" de hacerlo.Uso de Ruby on Rails link_to para vincular a la acción del controlador

he llamado un controlador home con dos acciones, index (que es el valor por defecto) y newbill. Dentro index.html.erb tengo:

<h1>Home View</h1> 
<%= link_to "new", :controller => "home", :action => "newbill" %> 

Sin embargo, me estaba poniendo un error de encaminamiento:

No route matches {:controller=>"home", :action=>"newbill"} 

Haciendo rake routes me da lo siguiente:

root/{:controller=>"home", :action=>"index"} 

que entonces (después de algunas google) que se añade este código a routes.rb

match 'home/newbill' => 'home#newbill', :as => :newbill 

Y luego en mi index.html.erb Tengo esto:

<%= link_to "Name", newbill_path %> 

Y ahora esto funciona como se esperaba. Mis preguntas sin embargo son:

  1. ¿Por qué funciona esto? ¿Qué está sucediendo exactamente detrás de escena?
  2. Sin duda, esta no es la mejor manera de hacerlo? Agregar otro match 'home/newbill'... para cada controlador/acción que deseo vincular me parece una manera de hacer las tonterías.

Me gusta mucho Ruby, pero luchando un poco con este aspecto de Rails ... ¡enrutar en general me hace perder la cabeza un poco, creo!

Cualquier ayuda es muy apreciada: D

Gracias,

Jack

Respuesta

7

Debe retirar la Rails Routing guide. Una lectura le ayudará a comprender lo que está sucediendo detrás de escena.

+11

Sabemos que hay documentos por ahí. -1 si pudiera porque esto no proporciona ninguna ayuda verdadera. – karns

+2

@karns La pregunta de esta persona fue "¿Por qué usar el motor de enrutamiento en la moda prescrita funciona?". Podría escribir laboriosamente la respuesta real (que ya se ha hecho en las guías de enrutamiento de Rails) o simplemente señalarlo. Él quiere entender cómo funciona el enrutamiento y hay un documento oficial y claro que lo explica en gran detalle. ¿No veo el problema? –

8

Supongo que la primera vez que su código no funcionó porque su controlador home está definido como un recurso.

Si se define un controlador como un recurso en routes.rb archivo se apoyará sólo 7 métodos estándar (de acuerdo a la arquitectura REST) ​​

index 
new 
create 
show 
edit 
update 
destroy 

Si necesitas más personalizada rutas se debe añadir de forma manual, por ejemplo en su caso 'Newbill', puede ir tan

resources :home do 
    collection do 
     get :newbill 
    end 
end 

Pero según mi entendimiento, su método de Newbill debe ir a bills controladores new, método no en el controlador de casa

Tienes razón, las rutas de Rails son un poco confusas (al menos para mí), pero una vez que entiendes puedes hacer muchas cosas interesantes.

Lea aquí por los rieles documentación oficial rutas:

http://guides.rubyonrails.org/routing.html

0

Esto funciona becuase carriles filtros cada petición a través del router en busca de un partido. Esto le permite definir rutas personalizadas como domain.com/post cuando la ruta es en realidad blog # post. Antes de los rieles 3, una ruta catch-all era la última ruta en el archivo de rutas. Esto le permitió definir un controlador y una acción y simplemente funcionaría. Estoy en mi iPad y no estoy cerca de ningún proyecto, por lo que no puedo verificarlo, pero creo que esa ruta todavía está en los raíles 3.1, solo tiene que ser compartida.

Cuestiones relacionadas