【问题标题】:Activerecord reputation system - nested routesActiverecord 信誉系统 - 嵌套路由
【发布时间】:2015-01-04 04:41:42
【问题描述】:

我正在尝试关注此视频railscast #364,但我的嵌套路线遇到了很多问题。当我使用此代码时:

<%= 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

【问题讨论】:

  • 这看起来不像是路由问题。正如错误消息所说,错误在ReviewsController#vote 中。请发布该方法的代码以及错误消息中的行号。
  • 错误来自第 18 行 @review = Review.find(params[:id]) 我仍然是菜鸟,这也意味着学习如何提问:)
  • 也很高兴展示您的模型。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

罪魁祸首是您的 link_to 的这一部分:vote_movie_review_path(@movie, @reviews, type: "up")。 @reviews 是 ActiveRecord::Relation 而不是 Review 记录,因此找不到带有 ID 的记录。

【讨论】:

  • 请用答案编辑您的原始问题或接受正确的答案,以便将来遇到类似问题的人可以找到答案。
  • Simon,你确实回答了我的问题,但我没有足够的声望来投票赞成你的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2023-03-03
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
相关资源
最近更新 更多