ruby-on-rails - namespace - routes rails examples
Rutas sobre comentarios y votos (2)
Como está utilizando member
en sus rutas, los rieles requieren una identificación en la url. En vote_up_book_comment_path(comment)
usted proporciona una identificación de book
, pero no una identificación de comment
. Interpretó el argumento de comment
como un libro. Para solucionar esto, incluya un objeto libro, cambiando vote_up_book_comment_path(comment)
a vote_up_book_comment_path(@book, comment)
. En su new
método de su controlador, incluya la variable del book
también para que su plantilla de vista pueda acceder a ella.
Para configurar comentarios en libros o películas:
Debido a que los comentarios son independientes de los libros o videos, no desea anidarlos debajo de los libros. En su lugar, haga que los comentarios sean una ruta separada, y solo tenga la ruta anidada en libros o videos cuando esté comenzando o edit
. De esta forma, puede tener un campo oculto en su plantilla de vista que almacena si se trata de un libro o un video, y luego pasarlo al controlador. Ahora el controlador tiene la información necesaria para saber si es un book_id
o un movie_id
.
Se vería algo como esto en el código:
resources :books do
resources :comments, only: [:new, :edit]
end
Haría esto para todos los recursos que desee. Finalmente, para comentarios, harías algo como esto:
resources :comments, except: [:new, :edit]
Tengo dos modelos que pueden comentarse, Libros y Películas.
Los comentarios son votables
En mi archivo de rutas:
resources :books, :path => '''' do
resources :comments do
member do
post :vote_up
end
end
En mi controlador de comentarios:
class CommentsController < ApplicationController
def create
book.comments.create(new_comment_params) do |comment|
comment.user = current_user
end
redirect_to book_path(book)
end
private
def new_comment_params
params.require(:comment).permit(:body)
end
def book
@book = Book.find(params[:book_id])
end
def vote_up
begin
current_user.vote_for(@comment = Comment.find(params[:id]))
render :nothing => true, :status => 200
rescue ActiveRecord::RecordInvalid
render :nothing => true, :status => 404
end
end
end
En mi vista:
<%= link_to(''vote for this post!'', vote_up_book_comment_path(comment),
:method => :post) %>
Sigo recibiendo este error:
No route matches {:action=>"vote_up", :controller=>"comments", :id=>nil, :book_id=>#<Comment id:
3, body: "fantastic read!", book_id: 113, created_at: "2014-02-15 17:08:10", updated_at:
"2014-02-15 17:08:10", user_id: 8>, :format=>nil} missing required keys: [:id]
Esta es la joya que estoy usando para votar: https://github.com/bouchard/thumbs_up
Los comentarios pueden pertenecer a libros o películas, ¿cómo configuro esto en las rutas? Además, ¿cómo configuro los votos en las rutas? (todos los comentarios son votables)
Si ejecuta rake routes
, probablemente obtendrá una línea en el resultado que se lee así:
vote_up_book_comment POST /:book_id/comments/:id/vote_up(.:format) comments#vote_up
Preste especial atención a esta parte; le dice lo que el método vote_up_book_comment_path
espera como argumentos:
/:book_id/comments/:id/vote_up(.:format)
Además, su mensaje de error le da algunos consejos:
No route matches ...
:id=>nil, :book_id=>#<Comment id: 3 ...
missing required keys: [:id]
El asistente de ruta espera un ID (para el comentario) y un book_id, y el orden en el que se requieren se muestra en las rake routes
(book_id primero, luego id).
Entonces, en resumen, debe pasar un book
a vote_up_book_comment_path
:
<%= link_to(''vote for this post!'', vote_up_book_comment_path(@book, comment), :method => :post) %>