Adición de una ruta para una acción de controlador

Estoy implementando un sistema similar en mi aplicación de rieles usando la gema de David Celis llamada Recomendable. Logré que todo funcionara en la consola, pero no puedo obtener las rutas correctas y recibo el error "Ninguna ruta coincide [GET] "/categories/1/posts/1/like".

Tengo lo siguiente en mis modelos:

class Category < ActiveRecord::Base
  has_many :posts, :dependent => :destroy
  extend FriendlyId
  friendly_id :name, use: :slugged
end

class Post < ActiveRecord::Base
  belongs_to :category
end

En mi Post Controller tengo:

class PostsController < ApplicationController
  before_filter :authenticate_user!
  before_filter :get_category
  def like
    @post = Post.find(params[:id])
    respond_to do |format|
      if current_user.like @post
      else
         flash[:error] = "Something went wrong! Please try again."
         redirect_to show_post_path(@category, @post)
      end
    end
  end
end

En mis rutas tengo:

resources :categories do
    resources :posts do
      put :like, :on => :member
    end
end
match 'categories/:category_id/posts/:id', :to => 'posts#show', :as => 'show_post'

¿Puede alguien señalar mis errores? Puedo hacer que PUT funcione, pero no sé de dónde proviene el error GET, ya que estoy tratando de redirigir de nuevo a la publicación si ocurre un error cuando al usuario le gusta una determinada publicación. Gracias de antemano.

EDIT:

En mi opinión tengo:

- title "#{@post.class}"
%p#notice= notice

%p
  %b Title:
  = @post.title
%p
  %b Description:
  = @post.description
%p
  %b Likes:
  = @post.liked_by.count

= link_to 'Edit', edit_category_post_path(@post)
\|
= link_to 'Back', category_posts_path
\|
= link_to 'Like', like_category_post_path(@post)

preguntado el 22 de mayo de 12 a las 16:05

¿Cómo intenta llegar a su like ¿acción? ¿Creaste algún enlace/botón para esto? Muéstranos el código de la plantilla para ello. -

2 Respuestas

Reemplazar:

= link_to 'Like', like_category_post_path(@post)

con:

= link_to 'Like', like_category_post_path(@category, @post), method: :put

O, como me gusta:

= link_to 'Like', [@category, @post], method: :put

Creo que su like tiene que ser:

def like
  @post = Post.find(params[:id])
  respond_to do |format|
    format.html do
      if current_user.like @post
        flash[:notice] = "It's ok, you liked it!"
        redirect_to :back
      else
         flash[:error] = "Something went wrong! Please try again."
         redirect_to show_post_path(@category, @post)
      end
    end
  end
end

contestado el 22 de mayo de 12 a las 17:05

Hola jdoe, gracias por tu ayuda! Me estoy acercando ahora. Por alguna razón, cuando hago esto, la transacción se realiza en la base de datos, pero la redirección no funciona mientras permanezco en localhost:3000/categorías/1/mensajes/1/me gusta después de hacer clic en mi enlace. Este sitio está en blanco, por lo que no recibo ningún error, ¿sabe por qué puede ser esto? Cuando ejecuto rutas de rake obtengo esto: show_post /categories/:category_id/posts/:id(.:format) posts#show like_category_post PUT /categories/:category_id/posts/:id/like(.:format) posts#like - Daniel Garzón

¿Publicaste el código completo de tu like ¿acción? No parece estar incompleto, ¡ESTÁ incompleto! - jdoe

Sí, mi acción Me gusta es mi código completo. Lo encontré en algún lugar en línea y el desarrollador de gemas lo compartió como ejemplo, y pensé que estaba completo. Esta es mi primera aplicación de rieles compleja, así que estoy luchando un poco. ¿Qué crees que falta? - Daniel Garzón

Verifique mi respuesta después de las palabras "O, como me gusta". - jdoe

¡UPS! Ya le diste "me gusta" a mi respuesta incluso sin esperar mi respuesta... :-) ¿Arreglaste tu acción? - jdoe

Su ruta espera un PUT solicitud, mientras emite una GET solicitud.

Deberá acceder a su ruta a través de un button_to con :method => :put para que su aplicación emita solicitudes PUT (la solución correcta), o cambie su ruta para usar GET solicitudes (la forma incorrecta de hacer solicitudes que modifican el estado):

      get :like, :on => :member

contestado el 22 de mayo de 12 a las 17:05

¡No lo hagas! Rompe todo lo que se dice en todos los libros decentes sobre Rails: NO UTILIZAR GET POR CAMBIAR DE ESTADO! ¡Tengo curiosidad por saber quién votó a favor de esta loca suposición! - jdoe

Desafortunadamente esto no está funcionando. Si cambio la ruta para obtener en lugar de poner, no ocurre ninguna transacción en la base de datos. En el otro caso, si en mi opinión agrego :method => :put obtengo un error "número incorrecto de argumentos (0 por 1)". ¡Gracias por tu ayuda! - Daniel Garzón

Como dijo @jdoe, no debe usar la solución de cambio de ruta. La forma correcta de solucionar esto es hacer que su aplicación emita una solicitud PUT. - megar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.