2013-11-20 40 views
0

我正在使用acts_as_follower宝石。使用示例代码,它可以在另一个用户对象之后正常工作。但我也想让用户关注文章。acts_as_follower对于多个模型

该代码看起来相当简单,除了FollowsController似乎是专门针对用户对象编码的事实。我应该为每种类型的对象创建单独的操作吗?

控制器/ follows_controller.rb

class FollowsController < ApplicationController 
    def create 
    @user = User.find(params[:user_id]) 
    current_user.follow(@user) 
    end 

    def destroy 
    @user = User.find(params[:user_id]) 
    current_user.stop_following(@user) 
    end 
end 

模型/ user.rb

... 
acts_as_followable 
acts_as_follower 
... 

模型/ article.rb

class Article < ActiveRecord::Base 
    ... 
    acts_as_followable 
    ... 
end 

的意见/如下/ create.js.erb

$('#follow_user').html('<%= escape_javascript(render :partial => "shared/follow_user", :locals => {:user => @user}) %>'); 

的意见/用户/ show.html.erb

... 
<% if user_signed_in? %> 
    <div id="follow_user"> 
    <%= render :partial => "shared/follow_user", :locals => {:user => @user} %> 
    </div> 
<% end %> 

的意见/用品/ index.html.erb

... 
<% if current_user.following?(article) %> 
    <%= button_to("Un-Follow #{article.id}", article_follow_path(article.to_param, current_user.get_follow(article).id), :method => :delete, :remote => true) %> 
<% else %> 
    <%= button_to("Follow #{article.id}", article_follows_path(article.to_param), :remote => true) %> 
<% end %> 

config/routes.rb

resources :articles do 
    resources :follows, :only => [:create, :destroy] 
end 

resources :users do 
    resources :follows, :only => [:create, :destroy] 
end 

回答

1

FollowsController是你的问题。有几种方法可以处理这个问题,其中之一是为每个模型使用一个专用的跟随控制器,作为一个跟随(例如FollowsUsersController,FollowsArticlesController等),并在config/routes.rb中使用适当的控制器。这些控制器都可以从父控制器FollowsController中下载,它只是将followable作为要实现的方法。

在应用程序/控制器/ follows_controller.rb

class FollowsController < ApplicationController 
    def create 
    current_user.follow(followable) 
    end 

    def destroy 
    current_user.stop_following(followable) 
    end 
end 

在应用程序/控制器/ follows_users_controller.rb

class FollowsUsersController < FollowsController 
    def followable 
    @followable ||= User.find(params[:user_id]) 
    end 
end 

在应用程序/控制器/ follows_articles_controller.rb

class FollowsArticlesController < FollowsController 
    def followable 
    @followable ||= Article.find(params[:article_id]) 
    end 
end 

在config/routes.rb

resources :articles do 
    resources :follows, :controller => 'follows_articles', :only => [:create, :destroy] 
end 

resources :users do 
    resources :follows, :controller => 'follows_users', :only => [:create, :destroy] 
end 

,你需要为每个控制器

的意见/ follows_users/create.js.erb

$('#follow_user').html('<%= escape_javascript(render :partial => "shared/follow_user", :locals => {:user => @followable}) %>'); 

的意见/ follows_articles/create.js定制JS的看法。erb

$('#follow_article').html('<%= escape_javascript(render :partial => "shared/follow_article", :locals => {:article => @followable}) %>'); 
+0

完美答案。非常感谢。 – ardochhigh