Полиморфный класс для драгоценного камня thumbs_up

Я хочу сделать общий контроллер голосования для множества различных контроллеров.

Я использую драгоценный камень Thumbs_up, который раньше был драгоценным камнем voice_fu.

https://github.com/kitop/thumbs_up/blob/master/lib/acts_as_voter.rb

Моя форма выглядит так, что является частичным с объектом @voteable:

<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 для String:Class

Тогда у меня вопрос, как полиморфно искать один и тот же объект... т. Е. Передать аргумент pollable_type и _id вместо самого объекта... Если нет другого более простого способа?

Контроллер выглядит так

  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

1 ответ

Решение

Сделал что-то подобное

  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 %>
Другие вопросы по тегам