Я использую 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.
Мне кажется, что в этом коде есть масса возможностей для усовершенствования, и я надеялся, что его направят в правильном направлении. В документации, кажется, есть ответы на все вопросы, но у меня проблемы с тем, чтобы заставить большинство из них работать.