act_as_votable большие пальцы вверх / вниз
Я установил гем act_as_votable, он работает в консоли, как и должно (как сказано в документации). Итак, мой вопрос, как настроить форму для кнопок повышения и понижения? или они могут быть просто ссылками?
вот документация: github.com/ryanto/acts_as_votable/blob/master/README.markdown
У меня есть пользователь и модель изображения; Предполагается, что пользователь сможет понравиться изображение. код с картинки, где должны быть кнопки:
<% for picture in @pictures %>
<p>
<%= image_tag picture.image_url(:thumb).to_s %>
</p>
<%= picture.created_at.strftime("%a, %d %b. %Y") %>, by
<%= link_to picture.user.name, picture.user %>
<h2> <%= link_to picture.name, picture %></h2>
[buttons here]
<%= picture.votes.size %> <% end %>
заранее спасибо!
2 ответа
Один из способов сделать это - добавить свои собственные действия контроллера для повышения и понижения голосов. Я предполагаю, что у вас есть current_user
метод доступен в вашем контроллере.
# pictures_controller.rb
def upvote
@picture = Picture.find(params[:id])
@picture.liked_by current_user
redirect_to @picture
end
def downvote
@picture = Picture.find(params[:id])
@picture.downvote_from current_user
redirect_to @picture
end
# config/routes.rb
resources :pictures do
member do
put "like", to: "pictures#upvote"
put "dislike", to: "pictures#downvote"
end
end
# some view
<%= link_to "Upvote", like_picture_path(@picture), method: :put %>
<%= link_to "Downvote", dislike_picture_path(@picture), method: :put %>
Вот как я в конечном итоге сделал это с гемом act_as_commentable. Поэтому я думаю, что это должно работать с любым объектом, к которому у вас есть комментарии.
В моем _comment.html.erb представлении
<%= link_to "Upvote", {:controller =>"comments", :action => "upvote", :id => comment.id}, :class => 'btn', method: :put %>
<%= link_to "Downvote", {:controller =>"comments", :action => "downvote", :id => comment.id}, :class => 'btn', method: :put %>
в моем файле rout.rb
put '/comments/:id/:action' => 'comments#upvote'
put '/comments/:id/:action' => 'comments#downvote'
Тогда в моих комментариях контроллер
class CommentsController < ApplicationController
before_filter :load_commentable
before_filter :find_comment, :only => [:upvote, :downvote]
def upvote
current_user.upvotes @comment
redirect_to(@comment.commentable)
end
def downvote
@comment.downvote_from current_user
redirect_to(@comment.commentable)
end
private
def load_commentable
resource, id = request.path.split('/')[1, 2]
@commentable = resource.singularize.classify.constantize.find(id)
end
def find_comment
@comment = Comment.find(@commentable.id)
end
end
Фильтры before обеспечивают большую гибкость, поэтому я могу добавить это к любому комментируемому объекту. У меня получилось, что это были фестивали, но вы могли делать фотографии или что-нибудь еще. Посмотрите документацию act_as_commentable и полиморфный Railscast для получения дополнительной информации об этом. Это мой первый пост, так что если это ужасный код, просто скажите мне.