Рельсы с гемом act_as_votable. У меня возникли проблемы с извлечением «voice_flag» для «current_user» - PullRequest
0 голосов
/ 21 апреля 2020

Я использую acts_as_votable gem для функции «как» или «в отличие». У меня есть модель «Пользователь» и модель «Проблема». (У пользователя проблемы has_many и эти проблемы принадлежат пользователю)

На внешнем интерфейсе (Реакция. js) Я хочу иметь только одну кнопку, которая отображается, если current_user имеет «понравился» или «не понравился» проблема. Я подумал, что это будет просто (возможно, для некоторых), но у меня возникли некоторые трудности с получением необходимой мне c информации, которая, по-видимому, живет в атрибуте vote_flag как логическое значение (true, если «like» и false если «unliked»), который идет с votes_for.

, я смог поместить :votes_for в моем сериализаторе проблем, и он отображает все голоса, которые были получены по любой данной проблеме со списком атрибутов, в том числе voter_id и vote_flag. Проблема в том, что votes_for перечисляет всех голосов, которые были сделаны на problem, и я хотел просто узнать, каков был голос current_user.

Первоначально Я мог перебирать список атрибутов на внешнем интерфейсе, чтобы я мог проверить все, но это была настоящая хакерская работа, и я подумал, что в бэк-энде будет намного чище.

Чтобы заставить это работать, я поместил метод в свой контроллер проблем ...

ProblecController

def like
    @problem = Problem.find(params[:id])
    if current_user

    render html: @problem.votes_for.where(voter_id: [current_user.id])
                         .pluck(:vote_flag)
    end
  end

(я использовал бит render html:, потому что рендеринг json оставил пустой массив и выдал ошибку, если current_user еще не проголосовал.)

... и затем вызвал запрос GET в моем компоненте ProblemShow. js.

ProblemShow. js

if (props.user) {
    useEffect(() => {
      axios({
        url: `${apiUrl}/problems/${props.match.params.id}/likes`,
        method: 'GET',
        headers: {
          'Authorization': `Token token=${props.user.token}`
        }
      })
        .then(res => setFlag(res.data[0]))
        .catch(console.error)
    }, [])
  }

Модель задачи

class Problem < ApplicationRecord
  belongs_to :user
  acts_as_votable
end

Модель пользователя

class User < ApplicationRecord
  include Authentication
  has_many :examples
  has_many :problems
  acts_as_voter
end

Я смотрел, используя области из docs , но я не могу реализовать их так, как мне нужно.

Я смотрел на voted_for? также из документов ...

To проверить, проголосовал ли избиратель по модели, вы можете использовать voted_for ?. Вы можете проверить, как проголосовал избиратель, используя voted_as_when_voted_for.

Мне кажется, что в этом коде есть масса возможностей для усовершенствования, и я надеялся, что его направят в правильном направлении. В документации, кажется, есть ответы на все вопросы, но у меня проблемы с тем, чтобы заставить большинство из них работать.

...