2013-12-23 4 views
0

У меня есть некоторые проблемы с destroy действием в моем приложении Rails. В моем приложении у меня есть модель UserVotes, которая позволяет пользователям голосовать друг за друга. Например: Джон голосует за других пользователей в порядке:Рельсы: уничтожить в неправильном порядке

Vote for User_1 
Vote for User_2 
Vote for User_3 

Когда Джон хочет удалить свой голос за User_3 он удаляемого голосовать за User_1, после повторной попытки он удаления голосовать за User_2, и только после двух попыток он удаление голосовать за User_3

user_votes_controller:

class UserVotesController < ApplicationController 

    def destroy 
     @user_vote = UserVote.find_by(params[:recipient_uid]) 
     @user_vote.destroy 
     redirect_to root_url 
     flash[:warning] = 'Deleted' 
    end 

end 

вид:

= link_to('Delete vote', user_vote, author_uid: current_user.uid, method: :delete) 
+2

Опубликовать определение модели, ваш метод кажется неправильным – nickcen

+0

В модели UserVote есть только 'принадлежит_to: user' –

+0

Зачем вам нужна модель UserVote? Почему бы просто не использовать модель 'Vote'? – AbM

ответ

0

Решение было довольно просто. Я просто переписал действие destroy в контроллере users_votes:

class UserVotesController < ApplicationController 

    def destroy 
     @user_vote = UserVote.find(params[:id]) 
     @user_vote.destroy 
     redirect_to root_url 
     flash[:warning] = 'Deleted' 
    end 

end 

Во всяком случае, спасибо за участие!

0

Я вижу пару вопросов в коде, который вы предоставили.

  1. Вы, кажется, получаете recipient_uid в find_by для UserVote, это должно быть uservote_id.
  2. Вы найдете решение об уничтожении, передав идентификатор автора, который не может быть уникальным ключом в голосах. Он просто вернет вам первую запись в таблице голосов.

Из-за пункта 2 вы получаете голосование пользователю 1 во-первых, голосуйте за пользователя 2 следующим и так далее. Вам нужно будет объяснить структуру пользователя, проголосовать, user_vote немного больше, если вы хотите, чтобы я предоставил правильное решение.

0

Модели:

class User < ActiveRecord::Base 
    has_many :user_votes 
    has_many :votes, :through => :user_votes 
end 

class Vote < ActiveRecord::Base 
    has_many :user_votes 
    has_many :users, :through => :user_votes 
end 

class UserVote < ActiveRecord::Base 
    belongs_to :author, class_name: "User", :foreign_key => :author_uid 
    belongs_to :recipient, class_name: "User", :foreign_key => :recipient_uid 
    belongs_to :vote 
end 

мнение,

= link_to('Delete vote', user_vote_path(user_vote), method: :delete) 

Контроллер

class UserVotesController < ApplicationController 

    def destroy 
     @user_vote = UserVote.find_by(params[:id]) 
     @vote = @user_vote.vote 
     @vote.destroy 
     @user_vote.destroy 
     redirect_to root_url 
     flash[:warning] = 'Deleted' 
    end 

end 
Смежные вопросы