【问题标题】:Rails app Active Record Reputation System Error Caller IdRails 应用程序 Active Record 信誉系统错误调用者 ID
【发布时间】:2013-06-05 20:02:35
【问题描述】:

按照 R. Bates Railscasts #364,我刚刚完成了 ARRS 的实施。 我更改了它以适合我的应用程序,所以

用户在放映视图中为电影投票

这与 r 完全不同。贝茨的一个地方

用户在索引视图中对俳句投票

在启动时,按钮看起来很好,它们出现在显示视图中。

但是当我点击一个时出现这个错误

为 nil 调用 id,它会错误地为 4 -- 如果你真的想要 nil 的 id,请使用 object_id

有什么想法吗?

Movies_controller.rb

class MoviesController < ApplicationController



  # GET /movies
  # GET /movies.json
  def index
    @search = Movie.search(params[:q])
    @movies = Movie.all


  end

  # GET /movies/1
  # GET /movies/1.json
  def show

      @movies = Movie.find_with_reputation(:votes, :all, order: 'votes desc')
      @search = Movie.search(params[:q])
    @movie = Movie.find(params[:id])


  end




    def search
        @search = Movie.search(params[:q])
        @movies = @search.result

        respond_to do |format|
            format.html # index.html.erb
            format.json { render json: @movies }
        end
    end

  # GET /movies/new
  # GET /movies/new.json
  def new
      @search = Movie.search(params[:q])
    @movie = Movie.new


  end

  # GET /movies/1/edit
  def edit
      @search = Movie.search(params[:q])
    @movie = Movie.find(params[:id])
  end

  # POST /movies
  # POST /movies.json
def create
    @search = Movie.search(params[:q])
    @movie = Movie.new(params[:movie])

    respond_to do |format|
      if @movie.save
        format.html { redirect_to @movie, notice: 'Movie was successfully created.' }
        format.json { render json: @movie, status: :created, location: @movie }
      else
        format.html { render action: "new" }
        format.json { render json: @movie.errors, status: :unprocessable_entity }
      end
    end
  end


  # PUT /movies/1
  # PUT /movies/1.json
 def update
     @search = Movie.search(params[:q])
    @movie = Movie.find(params[:id])

    respond_to do |format|
      if @movie.update_attributes(params[:movie])
        format.html { redirect_to @movie, notice: 'Movie was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @movie.errors, status: :unprocessable_entity }
      end
    end
  end


  # DELETE /movies/1
  # DELETE /movies/1.json
  def destroy

    @movie = Movie.find(params[:id])
    @movie.destroy
  end



def vote
  value = params[:type] == "up" ? 1 : -1
  @movie = Movie.find(params[:id])
  @movie.add_evaluation(:votes, value, current_user)
  redirect_to :back, notice: "Thank you for voting!"
end

end

电影.rb

has_reputation :votes, source: :user, aggregated_by: :sum

用户.rb

has_reputation :votes, source: {reputation: :votes, of: :movies}, aggregated_by: :sum

show.html.erb //电影

<div class="ratings">

  <em>
    <%= pluralize @movie.reputation_for(:votes).to_i, "vote" %>
    | <%= link_to "up", vote_movie_path(@movie, type: "up"), method: "post" %>
    | <%= link_to "down", vote_movie_path(@movie, type: "down"), method: "post" %>
  </em>
</div>

routes.rb

 resources :movies do
    member { post :vote }
  end

【问题讨论】:

  • 您可以在您的问题中添加相关代码吗?
  • 好吧?还有代码吗?或者一切都在那里?
  • 你能发布你的routes.rb吗?跟踪中的错误在哪一行?
  • 添加整个堆栈跟踪

标签: ruby-on-rails activerecord railscasts rating-system


【解决方案1】:
def vote
  value = params[:type] == "up" ? 1 : -1
  @movie = Movie.find(params[:id])
  @movie.add_evaluation(:votes, value, current_user)
  redirect_to :back, notice: "Thank you for voting!"
end

问题可能出在这里:

add_evaluation(:votes, value, current_user)

需要current_user你没有。设计文件说你需要包括 before_filter :authenticate_user! 在控制器中使用 current_user 助手。

使用 gem 时要多注意文档。

EIDT 在聊天解决这个问题后使用了acts_as_votable gem https://github.com/ryanto/acts_as_votable 而不是 Active Record Reputation System

【讨论】:

  • 我现在收到此错误 ---- #<0x007fac88e70f40>
【解决方案2】:

问题出在您的 add_evaluation 行中

改成 'add_or_update_evaluation(:votes, value, current_user)' 这将添加并更新评估部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2014-02-24
    • 2012-10-09
    • 1970-01-01
    相关资源
    最近更新 更多