Thumbs_up Gem Rails - как вернуть голос?
Я, наконец, получил свои голоса, которые были правильно поданы через ajax, однако я, похоже, вообще не могу голосовать. Вот мои модели:
class User < ActiveRecord::Base
acts_as_voter
end
class Vendor < ActiveRecord::Base
acts_as_voteable
end
Мои маршруты:
resources :vendors do
collection do
post :vote_for_vendor
delete :vote_against_vendor
end
end
Мой контроллер:
class VendorsController < ApplicationController
def vote_for_vendor
begin
vendor = Vendor.find(params[:vendor_id])
current_user.vote_for(vendor)
render :nothing => true, :status => 200
rescue ActiveRecord::RecordInvalid
render :nothing => true, :status => 404
end
end
def vote_against_vendor
begin
vendor = Vendor.find(params[:vendor_id])
current_user.vote_against(vendor)
render :nothing => true, :status => 404
rescue ActiveRecord::RecordInvalid
render :nothing => true, :status => 404
end
end
end
Мой взгляд:
<table class="table table-condensed table-hover">
<tr>
<th>Name</th>
<th>Address</th>
<th>Favorite?</th>
</tr>
<% @vendors.each do |v| %>
<tr>
<td><%= v.name %></td>
<td><%= v.address %></td>
<td id="toggle">
<% if current_user.voted_for?(v) %>
<%= button_to "Unlike", { :controller => :vendors, :action => 'vote_against_vendor', :vendor_id => v.id},
{ :method => 'delete', :remote => true }%>
<% else %>
<%= button_to "Like", { :controller => :vendors, :action => 'vote_for_vendor', :vendor_id => v.id},
{ :method => 'create', :remote => true} %>
<% end %>
</td>
</tr>
<% end %>
</table>
Так как же мне отменить голос поставщика? В документах thumbs_up я прочитал, что по умолчанию избиратель может голосовать только один раз. Означает ли это, что пользователь, который голосует за, не может затем голосовать? Цель моей реализации - иметь любимую или понравившуюся кнопку.
Вот что я получаю с сервера после нажатия "В отличие":
Started DELETE "/vendors/vote_against_vendor?vendor_id=1" for 127.0.0.1 at 2013-09-06 14:34:02 -0700
Processing by VendorsController#vote_against_vendor as JS
Parameters: {"authenticity_token"=>"/ZdePkPe+4rM8thUa+81hEL68cw1CJn93P0LQqEMC3s=", "vendor_id"=>"1"}
Vendor Load (0.2ms) SELECT "vendors".* FROM "vendors" WHERE "vendors"."id" = ? LIMIT 1 [["id", "1"]]
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
(0.1ms) begin transaction
Vote Exists (0.2ms) SELECT 1 AS one FROM "votes" WHERE ("votes"."voteable_id" = 1 AND "votes"."voteable_type" = 'Vendor' AND "votes"."voter_type" = 'User' AND "votes"."voter_id" = 1) LIMIT 1
(0.1ms) rollback transaction
Rendered text template (0.0ms)
Completed 404 Not Found in 7ms (Views: 0.6ms | ActiveRecord: 0.7ms | Solr: 0.0ms)
Совет для профессионалов: внимательно прочитайте документацию, прежде чем выглядеть глупо, и задайте глупый вопрос. Просто используйте unvote_for
способ сделать это. Не уверен, как я пропустил это в первый раз.
1 ответ
В vote_against_vendor
сразу после звонка vote_against
, ты делаешь это:
render :nothing => true, :status => 404
Когда вы, вероятно, должны сделать это:
render :nothing => true, :status => 200