Это слишком сухо, я иду за борт? - PullRequest
1 голос
/ 08 ноября 2010

Я сушу некоторый код, один из этих рефакторов выглядит следующим образом:
У меня есть 3 контроллера (ConstructionCompanies, RealEstateCompanies, People), каждый из которых имеет следующий шаблон:


class ConstructionCompaniesController &lt ApplicationController
before_filter :correct_user, :only => [:edit, :update]

private
   def correct_user
      @company = ConstructionCompany.find(params[:id]) 
      if(current_user.owner != @company.user)
        redirect_to(root_path)
      end
    end   

class RealEstateCompaniesController &lt ApplicationController
  before_filter :correct_user, :only => [:edit, :update]
...

private
   def correct_user
      @company = RealEstateCompany.find(params[:id]) 
      if(current_user.owner != @company.user)
        redirect_to(root_path)
      end
    end   

Как вы видите, правильный_пользователь повторяется в каждом контроллере.
Итак, что я сделал внутри, я помог, который включен для всех них, я создал метод:


def correct_user_for_seller_of_controller(controller)
    #"User".classify will return the class User etc.
    @seller = controller.controller_name.classify.constantize.find(params[:id])     
    redirect_to(root_path) unless (current_user == @seller.user)
  end                            

Знай, внутри каждого контроллера у меня есть:


class ConstructionCompaniesController &lt ApplicationController

  before_filter :only => [:edit, :update] do |controller| correct_user_for_seller_of_controller(controller) end           


class RealEstateCompaniesController &lt ApplicationController

 before_filter :only => [:edit, :update] do |controller| correct_user_for_seller_of_controller(controller) end           

Мне нравится тот факт, что сейчас СУХОЙ, но проблема в том, что мне кажется немного сложным, трудным для понимания. Я зашел слишком далеко?

Ответы [ 3 ]

4 голосов
/ 08 ноября 2010

Добавьте метод correct_user в класс ApplicationController.

class ApplicationController
  def correct_user_for_seller_of_controller
    #"User".classify will return the class User etc.
    @seller = controller_name.classify.constantize.find(params[:id])     
    redirect_to(root_path) unless (current_user == @seller.user)
  end  
end

В ваших контроллерах используйте новый метод в качестве метода фильтрации:

class RealEstateCompaniesController < ApplicationController

 before_filter :correct_user_for_seller_of_controller, :only => [:edit, :update]

end
1 голос
/ 08 ноября 2010

Лично я бы СУШИТ его немного больше и перенесу фильтр в суперкласс (или AppplicationController).

Сам метод также может быть определенно упрощен.Например, используйте некоторый самоанализ.

1 голос
/ 08 ноября 2010

Определенно хорошо это почистить. Я думаю, что вы, возможно, сделали вещи немного более сложными, чем необходимо, хотя, что со всем прочим Proc.

Если фильтр запускается на экземпляре контроллера, нет необходимости передавать контроллер самому себе. Просто наберите controller_name в методе, и все готово.

...