2013-07-24 52 views
1

所以,我很难获得Thumbs Up gem workin'。ActiveRecord :: RecordNotFound(无法找到id = vote_for的歌曲)[rails4]

当我点击向上箭头投票向上或向下我似乎刚开了在轨日志以下消息:

错误日志:

I, [2013-07-24T19:49:39.719359 #13941] INFO -- : Started PUT "/songs//vote_for" for 127.0.0.1 at 2013-07-24 19:49:39 -0400 
I, [2013-07-24T19:49:39.719444 #13941] INFO -- : Started PUT "/songs//vote_for" for 127.0.0.1 at 2013-07-24 19:49:39 -0400 
F, [2013-07-24T19:49:39.729009 #13941] FATAL -- : 
ActiveRecord::RecordNotFound (Couldn't find Song with id=vote_for): 
    app/controllers/songs_controller.rb:87:in `set_song' 

的index.html。 ERB

<div id="layout1"> 

<h3>Songs</h3> 

<ol> 
<% @songs.each do |song| %> 
<li><%= link_to song.title, song %><br></li> 

<%=link_to '&#9650'.html_safe, vote_for_song_path(@song), :remote => true, :method => :put %> 
<%=link_to '&#9660'.html_safe, vote_against_song_path(@song), :remote => true, :method => :put %> | 

    Submitted <%= time_ago_in_words(song.created_at) + " ago" %> 
    <span class="comments"> | <%= pluralize(song.comments.size, 'comment') %></span> | <span class="votes"><%= pluralize(song.votes.count, 'vote') %></span><br /> 



<%#= link_to 'Show', song, class: "button small secondary" %> 
<%= link_to('Edit', edit_song_path(song), class: "button small secondary") if can? :update, @song %> 
<%= link_to('Destroy', song, method: :delete, data: {confirm: 'Are you sure?'}, class: "button small secondary") if can? :destroy, @song %> 


<% end %> 

</ol> 
</div> 


<br /> 
</div> 

song_controller.rb

class SongsController < ApplicationController 
    before_filter :authenticate_user!, only: [:create ,:edit, :update, :destroy, :vote_for_song] 
    before_action :set_song, only: [:show, :edit, :update, :destroy, :vote_for_song] 


    def vote_for_song 
     @song = Song.find(params[:id]) 
     current_user.vote_for(@song) 
     respond_to do |format| 
     format.js { render 'update_votes' } 
     end 
    end 

    def vote_against_song 
    @song = Song.find(params[:id]) 
    current_user.vote_against(@song) 
    respond_to do |format| 
     format.js { render 'update_votes' } 
    end 
    end 


    # GET /Songs 
    # GET /Songs.json 
    def index 
    @songs = Song.all 
    end 

    # GET /Songs/1 
    # GET /Songs/1.json 
    def show 
    @comment = Comment.new(song: @song) 
    end 

    # GET /Songs/new 
    def new 
    @song = Song.new 
    end 

    # GET /Songs/1/edit 
    def edit 
    end 

    # POST /Songs 
    # POST /Songs.json 
    def create 
    @song = Song.new(song_params) 

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

    # PATCH/PUT /Songs/1 
    # PATCH/PUT /Songs/1.json 
    def update 
    respond_to do |format| 
     if @song.update(song_params) 
     format.html { redirect_to @song, notice: 'Song was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @song.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # Song /Songs/1 
    # Song /Songs/1.json 
    def destroy 
    @song.destroy 
    respond_to do |format| 
     format.html { redirect_to songs_url } 
     format.json { head :no_content } 
    end 
    end 

    private 

    def set_song 
     @song = Song.find(params[:id]) 
    end 

    def song_params 
     params.require(:song).permit(:title, :artist, :bio, :track, :user_id) 
    end 
    end 

song.rb

class Song < ActiveRecord::Base 

    acts_as_voteable 

    belongs_to :user 
    has_many :comments, :dependent => :destroy 


has_attached_file :track, 
        :url => "/assets/songs/:id/:style/:basename.:extension", 
        :path => ":rails_root/public/assets/songs/:id/:style/:basename.:extension" 


    validates_attachment :track, :presence => true 

    validates :title, length: { minimum: 10 } 
    validates :bio, length: { maximum: 300 } 



end 

user.rb

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_many :songs 
    has_many :comments 

    acts_as_voter 

end 

vote.rb

class Vote < ActiveRecord::Base 

    scope :for_voter, lambda { |*args| where(["voter_id = ? AND voter_type = ?", args.first.id, args.first.class.base_class.name]) } 
    scope :for_voteable, lambda { |*args| where(["voteable_id = ? AND voteable_type = ?", args.first.id, args.first.class.base_class.name]) } 
    scope :recent, lambda { |*args| where(["created_at > ?", (args.first || 2.weeks.ago)]) } 
    scope :descending, lambda { order("created_at DESC") } 

    belongs_to :voteable, :polymorphic => true 
    belongs_to :voter, :polymorphic => true 

    attr_accessible :vote, :voter, :voteable if ActiveRecord::VERSION::MAJOR < 4 


    # Comment out the line below to allow multiple votes per user. 
    validates_uniqueness_of :voteable_id, :scope => [:voteable_type, :voter_type, :voter_id] 

end 

的routes.rb

Leap2::Application.routes.draw do 

    resources :comments 

    devise_for :users, controllers: {registrations: 'registrations'} 
    resources :songs do 
    member do 
     put :vote_for, :vote_against 
    end 
    end 


    get '/contact', to: 'songs#contact' 
    get '/faq', to: 'songs#faq' 

    root to: 'songs#index' 

回答

1

index.html.erb这两条线,更换@songsong,它应该工作:

<%=link_to '&#9650'.html_safe, vote_for_song_path(@song), :remote => true, :method => :put %> 
<%=link_to '&#9660'.html_safe, vote_against_song_path(@song), :remote => true, :method => :put %> | 

也同样为这两条线:

<%= link_to('Edit', edit_song_path(song), class: "button small secondary") if can? :update, @song %> 
<%= link_to('Destroy', song, method: :delete, data: {confirm: 'Are you sure?'}, class: "button small secondary") if can? :destroy, @song %> 
+0

谢谢我的男人。我可以投票,现在它的作品:)但是当我点击向下箭头没什么'发生。为什么? – Apane101

+0

没问题 - 很高兴帮助。单击向下箭头时查看您的开发日志,并查看您的浏览器是否正在发送正确的远程请求。如果不是,链接还有其他问题。如果是,请注意任何提供线索的错误或信息消息。 – platforms

+0

如果您看到的是票数减少,请在轨道控制台中查看您投票时投票数据是否真正发生变化。这将有助于隔离问题是否在请求中,或者在vote_against_song控制器操作中的'render'update_votes''期间是否可能出现问题。 – platforms

相关问题