СУХОЙ мне: код Rails - PullRequest
       6

СУХОЙ мне: код Rails

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

Как я могу высушить это?

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

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

Ответ ниже и в модуле:

def correct_user_for_controller?(controller_name)
  @company = controller_name.classify.constantize.find(params[:id])     
  redirect_to(root_path) unless (current_user == @company.user)
end     

Тогда внутри любого контроллера включите модель и используйте

correct_user_for_controller?("ConstructionCompany") 

correct_user_for_controller?("RealEstateCompany")

Ответы [ 3 ]

3 голосов
/ 08 ноября 2010
module OwnershipPermission
    def accessible_for_user?(user)
        self.user == user
    end
end

Просто включите этот модуль в обе модели и выполните проверку уровня модели.Вы также можете создать модуль для контроллера, но я настоятельно рекомендую против этого (ухудшает ремонтопригодность).

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

Похоже, вы пытаетесь выполнить проверку авторизации ().

Проверяли ли вы какие-либо из существующих комплексных решений для авторизации?Возможно, имеет смысл использовать усилия других в решении этой общей проблемы.

Этот поток по авторизации для rails приводит несколько примеров.В частности, с помощью CanCan вы можете включить что-то подобное в метод, который вы пытаетесь защитить:

authorize! :read, @company

, который говорит: «Имеет ли текущий пользователь разрешение на просмотр сведений о @компания».

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

Если вы хотите, чтобы этот объект находился внутри ConstructionCompaniesController и RealEstateCompaniesController:

def correct_user
  @company = controller_name.classify.constantize.find(params[:id])     
  redirect_to(root_path) unless (current_user == @company.user)
end 
...