1

我獲得了幫助Setting up a polymorphic association提交表單和創建行動多形態協會

我現在有實現的提交表單,並創建行動的麻煩。用戶只需要關注並取消關注每個模型。

在我的跟蹤控制器

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以正確保存。有什麼建議麼? 在此先感謝,我花了很多時間與此。

+0

你有沒有想過這個?我在創建多態關聯時遇到了類似的問題。 – lflores

+0

@lflores是的,我做到了。我將添加我的解決方案 –

回答

1

這是我如何解決我的問題。答案是使用AJAX和設計的輔助方法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