Как вы используете метод Rails 3 gem для обновления модели базы данных?

#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)) %>. Извините за неясность. Мой обновленный пост должен упростить это. Еще раз большое спасибо!