2011-05-18 13 views
5

me estoy metiendo rieles y tratando de añadir una característica "voto" en un montaje de blog desde aquí: http://guides.rubyonrails.org/getting_started.htmlRuby on Rails: link_to acción, ninguna ruta coincide

En app/controllers/posts_controller.rb creé esto:

def incvotes 
    @post = Post.find(params[:id]) 
    post.update_attributes(:upvotes => 1) 
    format.html { redirect_to(@post, :notice => 'Vote counted.') } 
    format.xml { head :ok } 
    end 

en app/views/posts/index.html.erb creé esto:

<%= link_to 'Vote', :controller => "posts", :action => "incvotes", :id => post.id %> 

Pero el enlace está dando el error

No route matches {:controller=>"posts", :action=>"incvotes", :id=>1}

Me falta algo aquí, pero no estoy seguro de qué.

rutas rastrillo:

incvotes_post POST /posts/:id/incvotes(.:format) {:action=>"incvotes", :controller=>"posts"} 
     posts GET /posts(.:format)    {:action=>"index", :controller=>"posts"} 
       POST /posts(.:format)    {:action=>"create", :controller=>"posts"} 
    new_post GET /posts/new(.:format)   {:action=>"new", :controller=>"posts"} 
    edit_post GET /posts/:id/edit(.:format)  {:action=>"edit", :controller=>"posts"} 
     post GET /posts/:id(.:format)   {:action=>"show", :controller=>"posts"} 
       PUT /posts/:id(.:format)   {:action=>"update", :controller=>"posts"} 
       DELETE /posts/:id(.:format)   {:action=>"destroy", :controller=>"posts"} 
    home_index GET /home/index(.:format)   {:action=>"index", :controller=>"home"} 
     root  /(.:format)     {:action=>"index", :controller=>"home"} 
+0

¿Qué archivo de sus rutas decir con respecto a los mensajes? – sscirrus

+0

recursos: publicaciones – Zeno

Respuesta

3

tratar

= link_to "vote", incvotes_post_path(post), :method=>:post 

y si eso no funciona, trate de cambiar el método de: poner

+0

Con eso o poner, ambos dan el error: Ninguna ruta coincide con "/ posts/1/incvotes" – Zeno

+0

¿Es posible que tenga un error ortográfico en su código? Tienes 'post.update_attributes' cuando debería ser' @ post.update_attributes'. Sin embargo, no estoy seguro si eso causaría este problema. ¿Puedes publicar toda tu vista de índice y código de controlador también, por favor? ¿Tiene una cuenta github donde puede publicar el código para su modelo, controlador y vista de índice? Tal vez solo pegarlo en pastie. Lamento ser un dolor, pero algo no está bien en algún lado – stephenmurdoch

+0

Los 3 archivos aquí: http://pastie.org/1924217 – Zeno

3

Mi conjetura es que probablemente no tiene una definición en su archivo de rutas para la acción que acaba de definir en el controlador. Tanto una acción en el controlador como una acción en el archivo de rutas deben estar definidas para que Rails genere urls correctamente.

Su archivo de rutas probablemente tiene algo como esto:

resources :posts 

pero que desea agregar más de las acciones estándar generados por la palabra clave resources, por lo que intentar algo como esto:

resources :posts do 
    member do 
    post 'incvotes' 
    end 
end 

Este le dice a las rutas que tiene otra acción en su controlador de mensajes llamado incvotes que acepta solicitudes de publicación HTTP siempre que estén apuntando a una ruta miembro con la acción correcta (/ posts/14 es una ruta miembro, mientras que/posts/es una 'colección 'ruta). Por lo tanto, probablemente tenga una nueva ruta, como /posts/14/incvotes, a la que puede enviar un formulario y todo debería comenzar a funcionar correctamente.

EDIT:

En realidad, yo supongo que ya se acaba de añadir 1 a un atributo de un modelo, que no necesitan una acción POST (que normalmente se asocia con la publicación de las formas como con create y update). Para enviar una publicación, es posible que deba cambiar el código HTML en la vista para incluir un formulario y publicarlo en la URL correcta. Entonces puede intentarlo, o puede cambiar su archivo de rutas para leer get 'incvotes' en lugar de post 'incvotes'. Perdón por la confusión, ¡espero que ayude!

+0

Mi archivo de rutas se veía así, así que lo cambié a eso y el botón de votar ahora da: Ninguna ruta coincide con "/ posts/1/incvotes" – Zeno

+1

¿Puede usted desde la línea de comandos ejecutar 'rake routes' y agrega el resultado a tu pregunta? –

+0

Lo edité en mi primera publicación por razones de formato. – Zeno

1

La ruta incvotes_post solo acepta un HTTP POST, y un enlace siempre produce un HTTP GET.

Utilice un formulario con un botón en su lugar (o realice una POST con AJAX).

+2

Casi, la documentación 'link_to' indica que pasar el parámetro': method' como una opción de URL para link_to crea dinámicamente un formulario HTML con el método de publicación. Entonces, técnicamente puede usar 'link_to' para crear una solicitud POST. –

0

Trate de usar button_to lugar link_to:

En su opinión:

<%= button_to 'Vote', incvotes_post_path(post) %> 

En su config/routes.rb agregue la ruta t O incvotes acción como post:

resources :posts do 
    member do 
    post 'incvotes' 
    end 
end 

Y en su controlador, crear el incvotes acción:

def incvotes 
    # Something 
    redirect_to :posts 
end 
Cuestiones relacionadas