Простая система голосования не добавляет голосование в базу данных после нажатия на голосование вверх / вниз (Rails)? - PullRequest
1 голос
/ 01 февраля 2012

Я нашел это руководство по созданию простой системы голосования.

У меня уже есть модели Пользователь и Пост (простовключены соответствующие столбцы) и я использую Devise :

  create_table "posts", :force => true do |t|
    t.string   "content"
    t.integer  "user_id"
    t.string   "title"
    t.integer  "total_value",    :default => 0 // Added by following the tutorial 
  end

  create_table "users", :force => true do |t|
    t.string   "username"
  end

post.rb:

class Post < ActiveRecord::Base
  attr_accessible :title, :content

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

пользователя.rb:

class User < ActiveRecord::Base    
  has_many :posts, :dependent => :destroy
  has_many :comments, :dependent => :destroy   
end

voice.rb:

class Vote < ActiveRecord::Base
  belongs_to :post
end

миграция:

class CreateVotes < ActiveRecord::Migration
  def change
    create_table :votes do |t|
      t.integer :post_id
      t.integer :user_id
      t.boolean :value

      t.timestamps
    end

    add_index :votes, [:post_id, :user_id]
  end
end

Vote_controller.rb :

class VotesController < ApplicationController
  def vote_up
    check = Votes.find(:first,
                       :conditions => ["user_id = ? AND post_id = ?", session[:user_id], params[:id]])

    post = Post.find(params[:id])

    if check.nil?
      vote = Votes.new
      vote.post_id = params[:id]
      vote.user_id = session[:user_id]
      vote.value = true
      vote.save
      post.total_value += 1
      post.save
      render :text => post.total_value
    elsif check.value == false
      check.value = true
      check.save
      post.total_value += 2
      post.save
      render :text => post.total_value
    else
      render :text => "You have already voted up for this post."
    end
  end

  def vote_down
    check = Vote.find(:first,
                      :conditions => ["user_id = ? AND post_id = ?", session[:user_id], params[:id]])

    post = Post.find(params[:id])

    if check.nil?
      vote = Vote.new
      vote.post_id = params[:id]
      vote.user_id = session[:user_id]
      vote.value = true
      vote.save
      post.total_value -= 1
      post.save
      render :text => post.total_value
    elsif check.value == true
      check.value = false
      check.save
      post.total_value -= 2
      post.save
      render :text => post.total_value
    else
      render :text => "You have already voted down for this post."
    end
  end
end

views / pages / index.html.erb:

<% for i in @posts %>
  <h2><%= i.title %></h2>
  <p><%= i.content %></p>

  <div id="total_value_<%= i.id %>"><%= i.total_value %></div>

  <%= link_to "Vote up",   :url => {:controller => :votes, :action => :vote_up, :id => i.id},
                           :update => "total_value_#{i.id}",
                           :remote => true %>
  <%= link_to "Vote down", :url => {:controller => :votes, :action => :vote_down, :id => i.id},
                           :update => "total_value_#{i.id}", 
                           :remote => true %>
<% end %>

Все отображается, естьошибок нет, но когда я нажимаю "проголосовать" вверх или вниз, абсолютно ничего не происходит.

Есть предложения, чтобы это исправить?

РЕДАКТИРОВАТЬ:

Iне вижу ни ошибок, ни сохранения / создания сообщений в терминале, просто так:

Запустил GET "/assets/application.js?body=1" для 127.0.0.1 в 2012-02-01 06:47:50 +0800 Обслуживаемый актив /application.js - 304 Не изменено (0 мс) [2012-02-01 06:47:50] ПРЕДУПРЕЖДЕНИЕ Не удалось определитьermine content-length тела ответа.Установите длину содержимого ответа или установите Response # chunked = true

1 Ответ

1 голос
/ 01 февраля 2012

Вероятно, это опечатка, но если у вас нет, Vote.new, Vote.find,

Вместо этого у вас есть Votes.find и Votes.new

class VotesController < ApplicationController
  def vote_up
    check = Votes.find(:first,
                       :conditions => ["user_id = ? AND post_id = ?", session[:user_id], params[:id]])

    post = Post.find(params[:id])

    if check.nil?
      vote = Votes.new
      vote.post_id = params[:id]
      vote.user_id = session[:user_id]
      vote.value = true
      vote.save
      post.total_value += 1
      post.save
      render :text => post.total_value
    elsif check.value == false
      check.value = true
      check.save
      post.total_value += 2
      post.save
      render :text => post.total_value
    else
      render :text => "You have already voted up for this post."
    end
  end

  def vote_down
    check = Vote.find(:first,
                      :conditions => ["user_id = ? AND post_id = ?", session[:user_id], params[:id]])

    post = Post.find(params[:id])

    if check.nil?
      vote = Vote.new
      vote.post_id = params[:id]
      vote.user_id = session[:user_id]
      vote.value = true
      vote.save
      post.total_value -= 1
      post.save
      render :text => post.total_value
    elsif check.value == true
      check.value = false
      check.save
      post.total_value -= 2
      post.save
      render :text => post.total_value
    else
      render :text => "You have already voted down for this post."
    end
  end
end

Изменить этоПроголосовать.Другое предложение состоит в том, чтобы использовать драгоценный камень для этой функциональности.Для этого созданы тонны драгоценных камней.Vote_fu и acts_as_votable - два наиболее часто используемых.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...