Разъяснение о том, как использовать жемчужину голосования thumbs_up с Rails 3
Я пытаюсь реализовать жемчужину голосования thumbs_up в приложении на Rails 3, однако инструкции по реализации неясны. После запроса гема [ gem 'thumbs_up' ] и после создания и запуска соответствующей миграции [ rails generate thumbs_up && rake db: migrate ] README объясняет следующее:
Чтобы проголосовать за модель, вы можете сделать следующее:
* Сокращенный синтаксис
voter.vote_for(с правом голоса) # Добавляет +1 голос
voter.vote_against(для голосования) # Добавляет -1 голос
voter.vote(голосования, голосования) # Добавляет либо +1, либо -1 голос: голос => верно (+1), голос = = ложь (-1)
voter.vote_exclusively_for (voiceable) # Удаляет все предыдущие голоса данного избирателя и голосует за.
voter.vote_exclusively_against (для голосования) # Удаляет все предыдущие голоса данного избирателя и голосует против.*
Я предполагал, что использование "voter" и "voiceable" в примере README является заменой для объектов в приложении, но использование для меня все еще неясно.
Буквальный пример того, как должен выглядеть мой файл view, controller и rout.rb, - это ПОМОЩЬ. Я провел дни, пытаясь понять это!
В моем приложении есть пользователи, которые голосуют за сообщения, которые бывают двух типов - события и ссылки. Посты вызываются с использованием <% = render: частичный => @posts %>, и каждый отдельный пост использует в качестве своего представления " _event.html.erb " или " _link.html.erb " - в зависимости от того, является ли это событие или ссылка.
3 ответа
Надеюсь, я смогу вам немного помочь.
Генераторы должны были создать модель голосования для вас. Это модель, которая удерживает все голоса, но вы косвенно взаимодействуете с помощью методов, описанных выше.
Итак, для вас:
class User < ActiveRecord::Base
acts_as_voter
end
class Post < ActiveRecord::Base
acts_as_voteable
end
Это позволит вам настроить методы thumbs_up в каждой из моделей.
Тогда, например, если у вас есть действие контроллера в PostsController, на которое ссылается "стрелка вверх" на вашем веб-сайте, вы можете создать голосование за этого пользователя за этот пост.
Взгляд как это:
<%= link_to('vote for this post!', vote_up_post_path(@post), :method => :post) %>
и route.rb вот так:
resources :posts do
member do
post :vote_up
end
end
И, наконец, в контроллере:
class PostsController < ApplicationController
def vote_up
begin
current_user.vote_for(@post = Post.find(params[:id]))
render :nothing => true, :status => 200
rescue ActiveRecord::RecordInvalid
render :nothing => true, :status => 404
end
end
end
Ошибка маршрутизации
Не найдено ни одного маршрута {:action=>"voice_up",:controller=>"microposts",:id=>nil}
это ссылка, которую я использую, и предположим, что именно здесь маршрутизация указана неправильно. Я запустил рейковые маршруты, и есть маршрут с именем voice_up_micropost. Есть что-нибудь еще, что я должен изучить. Спасибо
вот ссылка, которую я добавил
<%= link_to('vote for this post!',
vote_up_micropost_path(@microposts),
:method => :post) %>
Это просто продолжение ответа Брейди.
У Брэди был следующий код по его мнению
<%= link_to('vote for this post!', vote_up_post_path(@post), :method => :post) %>
что он имеет в виду.. так как по умолчанию link_to использует :method => 'get'
И он хотел обновить запись, используя сообщение и не получить, поэтому он использует :method => 'post'
Вы можете использовать <% = button_to ('голосуйте за это сообщение!', Voice_up_post_path (@post)%>, потому что кнопка по умолчанию использует :method => :post
поэтому маршруты должны быть
resources :posts do
member do
post :vote_up
end
end
здесь, в post :vote_up
внутри члена, его method => :post
& не почтовый контроллер
но если вы решили использовать link_to
без :method => :post
что-то вроде этого
<%= link_to('vote for this post!', vote_up_post_path(@post)) %>
тогда ваш маршрут должен быть
resources :posts do
member do
get :vote_up
end
end
Надеюсь это поможет!