2015-01-04 6 views
1

Я стараюсь следить за этим видео railscast #364, но у меня много проблем с моими вложенными маршрутами. Когда я использую этот код:Система репутации Activerecord - вложенные маршруты

<%= link_to "up", vote_movie_review_path(@movie, @reviews, type: "up"), method: "post" %> 

Я получаю эту ошибку, когда я выбираю вверх голос:

ActiveRecord::RecordNotFound in ReviewsController#vote 

Couldn't find Review with 'id'=# <Review::ActiveRecord_Relation:0x007f0358c1e550> 

Это мой маршрут:

vote_movie_review POST /movies/:movie_id/reviews/:id/vote(.:format) genre_linkers#vote 

Я создал другую модель, которая не была вложенной используя этот код:

<%= link_to "up", vote_movie_path(movie, type: "up"), method: "post" %> 

, и это сработало. Поэтому я думаю, что это должно быть что-то не так с моим путем или как я называю объекты. Я почти весь день работал над этим, мне действительно нужна помощь.

review_controller.rb

class ReviewsController < ApplicationController 
    before_action :set_review, only: [:show, :edit, :update, :destroy] 
    before_action :set_movie 
    before_action :authenticate_user! 
    respond_to :html 

    def index 
    @reviews = Review.all 
    respond_with(@reviews) 
    end 

    def show 

    end 

    def vote 
    value = params[:type] == "up" ? 1 : -1 
    @review = Review.find(params[:id]) 
    @review.add_evaluation(:vote, value, current_user) 
    redirect_to :back, notice: "thanks for the vote" 
    end 


    def new 
    @review = Review.new 
    respond_with(@review) 
    end 

    def edit 
    end 

    def create 
    @review = Review.new(review_params) 
    @review.user_id = current_user.id 
    @review.movie_id = @movie.id 

    if @review.save 
     redirect_to @movie 
    else 
     render 'new' 
    end 
    end 

    def update 
    @review.update(review_params) 
    respond_with(@review) 
    end 

    def destroy 
    @review.destroy 
    respond_with(@review) 
    end 

    private 
    def set_review 
    @review = Review.find(params[:id]) 
    end 

    def set_movie 
    @movie = Movie.find(params[:movie_id]) 
    end 

    def review_params 
    params.require(:review).permit(:genre, :description, :vote) 
    end 

end 

routes.rb

Rails.application.routes.draw do 

    devise_for :users 
    resources :movies do 
    resources :reviews do 
     member { post :vote } 
    end 
    end 

    root 'movies#index' 


end 

и модель review.rb

class Review < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :movie 

    has_reputation :votes, source: :user, aggregated_by: :sum 
end 
+0

Это не похоже на проблему с маршрутами. Как говорится в сообщении об ошибке, ошибка находится в 'ReviewsController # vote'. Отправьте код для этого метода вместе с номером строки из сообщения об ошибке. –

+0

Ошибка из строки 18 @review = Review.find (params [: id]) Я по-прежнему ноб, и это также означает изучение вопросов, которые задают :) – Jesse

+0

было бы неплохо показать ваши модели. – Emanuel

ответ

1

Виновником является эта часть вашего link_to: vote_movie_review_path(@movie, @reviews, type: "up"). @reviews - это ActiveRecord :: Relation, а не запись Review, поэтому запись с идентификатором не найдена.

+0

Я все еще учился, так как я могу назвать рецензию? – Jesse

+0

Я понял, и теперь он работает. Благодарю. – Jesse

+0

Пожалуйста, отредактируйте исходный вопрос с ответом или примите правильный ответ, чтобы люди в будущем могли найти ответ, если у них есть аналогичная проблема. – Aventuris

Смежные вопросы