Вопрос проектирования (Ruby On Rails) - PullRequest
0 голосов
/ 27 февраля 2011

В моей системе есть много типов пользователей (4), в зависимости от того, вошедший в систему пользователь имеет доступ только к определенной информации.

Например, я пытаюсь сделать что-то подобное в моей модели клиента:

 class Client
     def self.allowed
        if current_user.is_a?(SuperAdmin)
          return self.all
        elsif current_user.is_a?(Client)
          return [current_user]
        elsif current_user.is_a?(ClientAdmin)
          return [current_user.client]
        end
      end
   end

Проблема в том, что моя модель не имеет доступа к вспомогательному методу current_user. (неопределенная локальная переменная или метод `current_user 'для #)

У меня есть 2 вопроса:

  1. Как я могу это исправить
  2. Должна ли логика, такая как получение разрешенного клиента, выполняться в модели?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

Используя вашу методологию, я бы определил метод, позволяющий передавать пользователю проверку, следующим образом:

class Client
   def self.allowed(user)
      if user.is_a?(SuperAdmin)
        return self.all
      elsif user.is_a?(Client)
        return [user]
      elsif user.is_a?(ClientAdmin)
        return [user.client]
      end
    end
 end

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

Как говорится, вы должны взять в библиотеке авторизации; Мне лично очень нравится CanCan . Это позволяет вам определять полномочия в одном месте, используя стиль, подобный тому, который вы здесь представляете. У автора, Райана Бейтса, есть отличный скринкаст по использованию CanCan .

0 голосов
/ 27 февраля 2011

1.Как я могу это исправить

Я не могу сказать, не видя, как вы пытаетесь получить доступ к методу, но вы можете учесть следующее в вашем ApplicationController:

before_filter :set_current_user

def set_current_user
  Client.current_user = current_user
end

Это обеспечивает копию current_user в вашей Client модели.

2.Должна ли логика, такая как получение разрешенного клиента, выполняться в модели?

Большинство используемых мной систем аутентификации поместили current_user (или эквивалентную функцию) в ApplicationController и предоставилиметоды защиты определенных действий контроллера от доступа неавторизованных пользователей.В конце концов, именно контроллеры должны решать, какие пользователи могут получить доступ к своим действиям, а не модели.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...