2015-08-04 4 views
0

Я создал базовый рубин на приложениях rails, где пользователи могут голосовать за булавку. Они могут голосовать за булавку, используя метод ajax.Ruby on rails: удалить запись голоса пользователем

Теперь я хочу, чтобы пользователи удалили свой голос.

Вот моя реализация:

pins_controller.rb:

def upvote 
    @pin = Pin.friendly.find(params[:id]) 
    @pin.votes.create(user_id: current_user.id) 
    respond_to do |format| 
    format.html { redirect_to @pin } 
    format.js 
    end 
    end 

users_controller.rb

def upvote 
    @pin = Pin.friendly.find(params[:id]) 
    @pin.votes.create(user_id: current_user.id) 
    respond_to do |format| 
    format.html { redirect_to @pin } 
    format.js 
    end 
    end 

vote.rb

class Vote < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :pin, counter_cache: true 
    validates_uniqueness_of :pin_id, scope: :user_id 
end 

pin.rb

has_many :votes, dependent: :destroy 

в моих взглядах, они могут upvote булавку через это:

<% if @pin.votes.where(user_id: current_user.id).empty? %> 
    <%= link_to upvote_pin_path(@pin), method: :put, remote: true do %> 
    Vote for this pin 
    <% end %> 
<% else %> 
<% end %> 

Теперь я хотел бы, чтобы пользователи могли удалить запись голосов, но я Я не знаю, как это сделать, я попытался создать метод downvote в моих контроллерах, но ничего не получилось.

Любые идеи, чтобы поставить меня на путь?

+0

«Я попытался создать метод downvote в моих контроллерах, но ничего не получилось». Это поможет, если вы включили код, который вы пробовали, в противном случае вы просите людей делать произвольные догадки. – MarsAtomic

ответ

0

Дополнительная информация была бы полезна. Например, я предполагаю, что существуют какие-то ограничения, например, каждое голосование должно быть привязано к пользователю и только один голос на контакт для каждого пользователя. Однако решения что-то вроде

В вашем pins_controller.rb

def downvote 
    @pin = Pin.friendly.find(params[:id]) 
    Vote.where(:user_id => current_user.id, :pin_id => @pin.id).each { |v| v.delete } 

    respond_to do |format| 
    format.html { redirect_to @pin } 
    format.js 
    end 
end 

И в ваших взглядах

<% if @pin.votes.where(user_id: current_user.id) %> 
    <%= link_to downvote_pin_path(@pin), method: :put, remote: true do %> 
    DELETE your Vote for this Pin! 
    <% end %> 
<% else %> 
<% end %> 

Вы, вероятно, хотите, чтобы создать удобный метод для проверки, что

В модели/pin.rb

class Pin 
     ... 
     def owned?(id) 
     self.votes.where(user_id: id).count > 0 ? true : false 
     end 
end