Доступ к правилам CanCan основного приложения из движка Rails 3.1 - PullRequest
5 голосов
/ 27 марта 2012

Я пытаюсь использовать гем Forem , который использует инфраструктуру авторизации CanCan, а также мое основное приложение.И основное приложение, и Rails Engine имеют свои собственные файлы able.rb .

Проблема возникает в макете, когда я пытаюсь выполнить некоторые проверки авторизации:

    <% if can? :update, User %>
        <%= link_to_current_user :content_method => :login %>.
    <% else %>

Когда я использую файл макета на движке, он обращается к своему собственному файлу способность.rb для авторизации.Естественно, в моем основном приложении нет никаких правил, поэтому авторизация завершается неудачно, когда не должна.Могу ли я заставить его перейти на «главный» CanCan?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 11 апреля 2012

Я думаю, что самое простое решение - это определение monkey-patch forem для добавления ваших собственных объявлений:

class Forem::Ability
  alias_method :orig_init, :initialize
  def initialize(user)
    orig_init(user)

    # Put your own authorization code here.
  end
end

class Ability < Forem::Ability; end

Когда в контексте движка метод can? должен использовать контроллер / пространство имен движка для авторизации действий (Forem::Ability), когда в контексте вашего собственного приложения он использует ваш собственный контроллер и нет пространства имен для выполнения то же самое.

Поэтому я думаю, что это решение здесь (которое добавит все действия по авторизации как к Ability, так и к Forem::Ability, должно решить вашу проблему.

ОБНОВЛЕНИЕ: теперь я понимаю, что метод current_ability контроллера двигателя, вероятно, читает что-то вроде:

def current_ability
  @current_ability ||= Forem::Ability.new(current_user)
end

А ваш (по умолчанию из камня канкан) выглядит примерно так:

def current_ability
  @current_ability ||= Ability.new(current_user)
end

Так что мое решение выше должно исправить вашу проблему, но это, скорее всего, специфическая проблема, с которой он сталкивается.

0 голосов
/ 05 апреля 2012

Я все еще новичок в рубине, но я надеюсь помочь вам со следующим.

Обновление

Другая проблема, которую стоит попробовать, как сказано в cancan / wiki / admin-namespace , заключается в выборе файла способности, который нужно загрузить для ваших моделей.

Создайте собственную модель:

# in models/admin_ability.rb

class AdminAbility
  include CanCan::Ability

  def initialize(user)
    # define admin abilities here ....
  end
end

Затем используйте его для вашей модели

def current_ability
   @current_ability ||= AdminAbility.new(current_user)
end

Я надеюсь, что это решение помогло решить вашу проблему.

Steph

0 голосов
/ 04 апреля 2012

Единственный способ, который я нашел до сих пор, - это объединить оба файла в один, разделить его на модуль и обезьяна исправить обе способности при запуске. Не очень ..

...