#ruby-on-rails #rubygems #gem #vote-up-buttons
#ruby-на-рельсах #rubygems #кнопки голосования #ruby-on-rails
Вопрос:
Я использую драгоценный камень Thumb_Up для ruby on rails. https://github.com/brady8/thumbs_up
Я хочу, чтобы пользователи могли голосовать за посты. Однако я не могу понять, как я могу разрешить пользователю нажимать кнопку рядом с каждым сообщением и добавлять голосование в базу данных.
Я могу добиться этого в консоли rails, выполнив следующее:
u=User.first
m=Micropost.first
u.vote_for(m)
Однако, как я могу добиться, чтобы это происходило при нажатии кнопки в поле зрения. Я предполагаю, что мне придется использовать ajax, но как я узнаю URL, который мне нужно опубликовать, чтобы выполнить это действие?
Мы были бы очень признательны за любую помощь.
Обновить:
Большое спасибо за помощь! У меня все еще возникает проблема с приведенным ниже кодом.
Вот мои маршруты.rb
resources :microposts do
post :vote, :on => :member
end
Вид:
<%= link_to('vote for this post!', vote_micropost_path(@micropost), :method => :post) %>
Контроллер:
def vote
@micropost = Micropost.find(params[:id])
current_user.vote_for @micropost
# This assumes you'll only call it via AJAX.
# If your ajax call doesn't return "ok", then you know something went wrong
render :text => 'ok', :layout => false
end
Тем не менее, я все еще получаю эту ошибку:
Маршрут не совпадает {:controller=> «микропосты», :id=>#, :action=>»голосование»}
Кто-нибудь знает, почему маршруты не совпадают правильно?
Комментарии:
1. Да, это немного понятнее. Похоже, на ваш взгляд, @micropost на самом деле не устанавливается в запись Micropost. Какое бы действие ни выполняло рендеринг этого представления, необходимо установить @micropost, точно так же, как это делает действие vote .
Ответ №1:
Я предполагаю, что Rails 3. Маршруты Rails 2 будут выглядеть немного иначе.
Сначала вам нужно будет определить маршрут в вашем файле config / routes.rb. Вы могли бы сделать это многими способами. Если у вас уже есть маршрут для микропостов, вы могли бы просто добавить действие «проголосовать»:
resources :microposts do
post :vote, :on => :member
end
(Для ясности, «post» выше относится к методу HTTP POST и не имеет ничего общего с вашим классом Micropost.) Если вы используете этот маршрут, вам нужно будет создать метод «vote» в вашем контроллере Microposts, чтобы перехватить его. Что-то вроде
def vote
@post = Micropost.find(params[:id])
current_user.vote_for @post
# This assumes you'll only call it via AJAX.
# If your ajax call doesn't return "ok", then you know something went wrong
render :text => 'ok', :layout => false
end
Затем в вызове AJAX POST вашего представления (предполагая приведенный мной пример маршрута) вы получите URL с:
vote_micropost_path(@micropost)
Это будет выглядеть как / microposts/56/vote
Комментарии:
1. На мой взгляд, я использую эту link_to: жирный **<%= link_to(‘проголосуйте за этот пост!’, vote_micropost_path(@micropost), :method => :post) %> **жирный . Я продолжаю получать эту ошибку, маршрут не соответствует {: controller=> «microposts», :id=>#<Идентификатор микропоста: ноль, product_name: ноль, original_price: ноль, sale_price: ноль, store: ноль, user_id: ноль, created_at: ноль, updated_at: ноль, up_votes: 0, down_votes: 0>, :action=> «голосование»} Вот что я также использовал для своего маршрута: ресурсы: microposts, :only => [ :создать, :уничтожить] опубликовать :проголосовать, :на => :конец участника Большое вам спасибо за помощь.
2. Ваш маршрут выглядит нормально. Я предполагаю, что @micropost установлен на объект Micropost, за который вы хотите проголосовать? Потому что похоже, что это совершенно новый объект Micropost, которого на самом деле нет в базе данных.
3. Я использовал это в контроллере, чтобы получить текущий микропостинг. @micropost = Micropost.find(параметры [:id]) Нужно ли мне каким-то образом передавать идентификатор того, на который нажимается? Как вы могли бы сделать что-то подобное или есть более простой трюк.
4. Я не уверен, что понимаю. Где находится этот код в вашем контроллере — в действии «проголосовать» или в действии, которое отображает кнопки голосования в вашем микропостинге? И как будет выглядеть URL-адрес?
5. Я пытаюсь скопировать то, как вы это сделали. Я обновил свой пост выше кодом, который я использовал, и местоположениями. Я ввел @micropost = Micropost.find(параметры [:id]) в действие «голосование». Я поместил это в представление: <%= link_to(‘проголосуйте за этот пост!’, vote_micropost_path(@micropost)) %>. Извините за неясность. Мой обновленный пост должен упростить это. Еще раз большое спасибо!