Отправить форму и создать действие для Полиморфной Ассоциации - PullRequest
1 голос
/ 20 января 2012

Я получил помощь Настройка полиморфной ассоциации

У меня возникли проблемы с реализацией формы отправки и созданием действия.Пользователь просто должен подписаться и отписаться от каждой модели.

В моем контроллере подписки

 class FollowsController < ApplicationController
       before_filter :find_supports

  def create
    @relation = find_supports
    @follow = @relation.find(params[:follow])
    current_user.follows.follow!(@follow)
      respond_to do |format|
      format.html { redirect_to :back }
      format.js
    end
  end

 def destroy
   @follows = Follow.find(params[:id]).followable
    current_user.unfollow!(@follows)
    respond_to do |format|
      format.html { redirect_to :back }
      format.js
    end
 end

  private
  def find_supports
    params.each do |name, value|
      if name =~ /(.+)_id$/
         return $1.classify.constantize.find(value)
     else
       nil
     end
    end
  end
end 

В моей форме подписки, отображаемой на моих полиморфных моделях

РЕДАКТИРОВАТЬ

 <%= form_for @cause.follows.build(params[:follow]) do |f| %>
  <div><%= f.hidden_field :followable_id %></div>
  <div><%= f.hidden_field :followable_type %></div>
  <div><%= f.hidden_field :follower_id %></div>

 <div class="create-button"><%= f.submit "Follow" %></div>
    <% end %>  <!-- I now get the values for followable_id and followable_type, but it         
               wont get grab the follower_id and I get an error in the create action -->

и в моей пользовательской модели у меня есть эти 3 метода

   def following?(follow)
       follows.find_by_followable_id(follow)
   end
   def follow!(followable)
       follows.create![]    ##I have tried many different params here
   end
   def unfollow!(followable)
       follows.destroy(params[:followable_id]).destroy
   end

Я не могу получить follower_id, followable_id и followable_type для правильного сохранения.Какие-либо предложения?Заранее спасибо, я потратил много часов на это.

1 Ответ

1 голос
/ 19 марта 2013

Вот как я решил свои проблемы.Ответом является использование вспомогательного метода AJAX и Devise current_user

Форма Частичная

  <%= form_for @relation.supports.build(params[:support]), :remote => true do |f| %>
   <div><%= f.hidden_field :supporter_id, :value => current_user.id %></div>
    <div><%= f.hidden_field :supportable_id %></div>
   <div><%= f.hidden_field :supportable_type %></div>
   <%= f.submit "Support", :class => "support-button" %>
   <% end %>

Мой контроллер

class SupportsController < ApplicationController
before_filter :find_relation

def create
  @relation.supports.create!(params[:support])
respond_to do |format|
  format.html { redirect_to :back }
  format.js
 end
end

def destroy
 @relation.supports.find(params[:id]).destroy
 respond_to do |format|
   format.html { redirect_to :back }
   format.js
 end
end

private
 def find_supports(instance_params)
   class_name = instance_params["supportable_type"].classify.constantize
   class_name.find(instance_params["supportable_id"])
 end 

def find_relation
  @relation = find_supports(params[:support])
end
end

Кроме того, добавьте before_filter во все контроллеры, которые отображаютФорма для поиска правильного объекта.Это позволит вам использовать одну и ту же часть формы со всеми вашими полиморфными классами.

    def find_supports
       @relation = YourClass.find(params[:id])
    end
...