2013-11-20 5 views
0

Я использую act_as_follower gem. Используя примерный код, он отлично работает для пользователя, следующего за другим объектом пользователя. Но я также хочу, чтобы Пользователь выполнял статью.act_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

The 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 

и вы будете нуждаться в настраиваемые представления JS для каждого контроллера

просмотров/follows_users/create.js.erb

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

просмотров/follows_articles/create.js.erb

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

Отличный ответ. Огромное спасибо. – ardochhigh

Смежные вопросы