act_as_votable не работает, когда я голосую за/против

Я пытаюсь разрешить treatment голосовать за или против, но методы, предоставляемые act_as_votable, похоже, не работают должным образом. Когда я пытаюсь отобразить сумму голосов за и против, он каждый раз возвращает 0, что означает, что голоса не регистрируются должным образом.

My treatments_controller.rb

def upvote
  @treatment = Treatment.find(params[:id])
  @treatment.upvote_by @current_user

  render 'show'
end

def downvote
  @treatment = Treatment.find(params[:id])
  @treatment.downvote_by @current_user

  redirect_to treatments_path
end

My treatment.rb

class Treatment < ActiveRecord::Base
acts_as_votable


 has_many :review
 has_one :service


    def score
  self.get_upvotes.size - self.get_downvotes.size
end

end

My routes.rb

resources :treatments do
  member do
    put "like", to: "treatments#upvote"
    put "dislike", to: "treatments#downvote"
  end
end

И мой treatments/show.html.erb

<div class="container">
    <div class="row">
      <div class="col-sx-12 col-sm-12 col-md-8">
        <h3><%= @treatment.name %></h3></br></br>
 <h3>
           <%= link_to "upvote", like_treatment_path(@treatment), method: :put %></br>
            <%= link_to "downvote", dislike_treatment_path(@treatment), method: :put %></br>
            <%= @treatment.score %></br> </h3>

В логе сервера написано следующее

Started PUT "/treatments/1/like" for ::1 at 2015-12-09 16:22:14 +0000
Processing by TreatmentsController#upvote as HTML
  Parameters: {"authenticity_token"=>"hQnqV+OZ6m/9kFnr5YH6j563DIjyKfA4K/8fH6kpFbXbJRbsHCcNYn1AX4usZmUNXPlnFpxHMwTM8ilFxcbdhQ==", "id"=>"1"}
Geokit is using the domain: localhost
  Treatment Load (0.5ms)  SELECT  "treatments".* FROM "treatments" WHERE "treatments"."id" = ? LIMIT 1  [["id", 1]]
   (0.5ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."vote_flag" = ? AND "votes"."vote_scope" IS NULL  [["votable_id", 1], ["votable_type", "Treatment"], ["vote_flag", "t"]]
   (0.0ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."votable_id" = ? AND "votes"."votable_type" = ? AND "votes"."vote_flag" = ? AND "votes"."vote_scope" IS NULL  [["votable_id", 1], ["votable_type", "Treatment"], ["vote_flag", "f"]]
  Rendered treatments/show.html.erb within layouts/application (6.5ms)
  User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 4]]
Completed 200 OK in 569ms (Views: 563.3ms | ActiveRecord: 1.0ms)

person Fergus Morton    schedule 09.12.2015    source источник
comment
Посмотрите на журналы вашего сервера, когда вы нажимаете вверх/вниз - видите что-то не так? Какой HTTP-ответ? Есть ли голоса в БД после этого?   -  person Kristján    schedule 09.12.2015
comment
@Kristján Я добавил журнал сервера в исходный пост.   -  person Fergus Morton    schedule 09.12.2015
comment
В вашем журнале нет INSERT для нового голосования. @current_user.nil? Должно ли быть current_user?   -  person Kristján    schedule 09.12.2015
comment
Я думаю, вы правы, я изменил его на current_user. Но теперь я получаю сообщение об ошибке undefined local variable or method current_user', хотя оно определено в ApplicationHelper в другом методе def signed_in?   -  person Fergus Morton    schedule 09.12.2015
comment
Помощники не загружаются в контроллеры, если вы явно не included их и называете вещи одинаково не делает их одинаковыми. Вы, вероятно, захотите написать метод current_user в ApplicationController или запустить before_action, который устанавливает @current_user, который будет сохраняться в течение всего действия.   -  person Kristján    schedule 09.12.2015
comment
Методы @FergusMorton ApplicationHelper видны вашим представлениям, если вы хотите использовать их в своих контроллерах, вам придется либо include ApplicationHelper в вашем application_controller.rb, либо определить свой метод напрямую в этом файле.   -  person Amr Noman    schedule 09.12.2015


Ответы (1)


Благодаря помощи Кристьяна я понял, что вставки не происходит. Я определил current_user в методах upvote и downvote. Пересмотренные рабочие версии выглядят так.

 def upvote
  current_user = User.find_by_id(session[:user_id])
  @treatment = Treatment.find(params[:id])
  @treatment.upvote_by current_user

  render 'show'
end

def downvote
  current_user = User.find_by_id(session[:user_id])
  @treatment = Treatment.find(params[:id])
  @treatment.downvote_by current_user

  render 'show'
end
person Fergus Morton    schedule 09.12.2015