method_missing и association_proxy в рельсах - PullRequest
0 голосов
/ 18 мая 2011

Итак, вот моя проблема.В настоящее время я создаю простую систему аутентификации для сайта rails.У меня есть 3 класса для этого: человек, сессия и роль.В моей модели Person я определил method_missing для динамического захвата ролей в соответствии с этим руководством .

В моем application_controller у меня есть некоторая логика для работы с входами и выходами из системы, результатомкоторый дает мне зарегистрированного пользователя через: @user = @application_session.person Где @application_session - текущий сеанс

Теперь на одном из моих контроллеров я не хочу, чтобы кто-либо мог что-либо делать, если он неadmin, поэтому я включил: before_filter @user.is_an_admin?

Это поднимает NoMethodError, хотя в моей модели определено method_missing.Я попытался определить is_an_admin?, заставить его всегда возвращать true в качестве теста, и это работает.

Согласно этот вопрос , я думаю, что проблема может иметь какое-то отношение к ассоциациям прокси.Когда я запускаю: puts @user.proxy_owner, я получаю объект сеанса, поскольку каждый пользователь (Person) может иметь много сеансов, и я получил своего пользователя (Person) из текущего сеанса.

Я очень смущен, почему @user.is_an_admin? не вызывает метод method_missing в моем контроллере Person.Пожалуйста, дайте мне знать, если вам нужна дополнительная информация или фрагменты кода.

Я использую Rails 3 на Ruby 1.9

Ответы [ 3 ]

0 голосов
/ 18 мая 2011

Я решил это, переместив метод method_missing на мой application_controller.rb. Я немного изменяю логику метода, чтобы проверить пользователя, и, если он найден, динамически проверить роль. Если вещи не были кошерными, я бы перенаправил метод на root_url или вернул true, если пользователь совпал с запрошенными ролями.

Наконец, в моем контроллере отчетов я использовал before_filter :is_an_admin? и получил желаемый результат. Тем не менее, мне все еще неясно, почему method_missing должен был быть определен в моем контроллере приложений, а не непосредственно в модели Person (aka @user)?

0 голосов
/ 09 июня 2011

Я использую аналогичную проверку разрешений в своей системе, чтобы проверить привязку User> Role> Permissions: User.current_user.can_sysadmin?

В моих контроллерах вместо этого я должен использовать: User.current_user.send('can_sysadmin?')

Thisможет работать и для вас.

0 голосов
/ 18 мая 2011

Я бы посчитал метод_пропуском излишка для такой задачи.

Теперь, если у вас есть класс Session, который принадлежит_Пользователю, тогда вы можете иметь это:


class Session
  belongs_to :user, :extend => PermissionMixin
end

class User
  include PermissionMixin
end

module PermissionMixin
  def admin?
    if cond
      true
    else
     false
    end
  end
end

P.S. Отметьте cancan , возможно, он подойдет вам лучше.

...