Полиморфный класс для Thumbs_up голосования
-
27-10-2019 - |
Вопрос
Я хочу сделать общий контроллер голосования для множества различных контроллеров.
Я использую драгоценный камень Thumbs_up, который ранее был драгоценным камнем голосования.
https://github.com/kitop/thumbs_up/blob/master/lib/acts_as_voter.rb
Моя форма выглядит так, что является частично с объектом @votable:
<strong class="result">Votes: <%= voteable.votes_for - voteable.votes_against %></strong>
<%= form_tag user_votes_path(current_user) do |f| %>
<%= radio_button_tag :thumb_direction, :up %>
<%= radio_button_tag :thumb_direction, :down %>
<%= hidden_field_tag :voteable, @voteable %>
<%= submit_tag :vote %>
<% end %>
Однако, когда я пытаюсь передать голосовамую объект напрямую в контроллер, он не работает.
Неопределенный метод `base_class 'для строки: класс
Мой вопрос заключается в том, как полиморфически искать один и тот же объект ... т. Е. Пропустить голосование_тип и _ид вместо самого объекта ... если нет другого более простого способа?
Контроллер выглядит так
def create
#@user = User.find(params[:user_id])
current_user.vote(params[:voteable], :direction => params[:thumb_direction], :exclusive => true)
end
#routes
resources :users do
resources :votes
end
Решение
Сделал что -то подобное
def create
voteable_class = params[:voteable_type].constantize
voteable_id = (params[:voteable_type].downcase + "_id").to_sym
voteable_instance = voteable_class.find(params[voteable_id])
current_user.vote(voteable_instance, :direction => params[:thumb_direction], :exclusive => true)
redirect_to :back
end
И изменил мои маршруты для вложенного ресурса для голосования на каждой модели, которую я хотел использовать.
эрб
<%= form_tag [voteable, Vote.new] do |f| %>
<%= radio_button_tag :thumb_direction, :up %>
<%= radio_button_tag :thumb_direction, :down %>
<%= hidden_field_tag :voteable_type, voteable.class %>
<%= submit_tag :vote %>
<% end %>