Почему я получаю неправильное количество аргументов 1 для 0, используя cancan? - PullRequest
1 голос
/ 07 августа 2011

Авторизация на основе ролей в моем приложении основана на канкане (используя rvm 1.9.2@rails_3_0_9 и AuthLogic):

В тестируемом виде я получаю следующее:

неверное количество аргументов (1 для 0) Извлеченный источник (около строки # 12):

12: %td = link_to 'Edit', edit_session_path(session) if can? :manage, @session

Я должен объяснить, что обычные классы аутентификации для моделей Authlogic, User и User_session заменены в этом приложениис Contact и Contact_sessions.Приведенный выше экземпляр модели сеанса не часть аутентификации здесь.(Думаю, суд сейчас на заседании ...).Это означает, что вы должны сообщить cancan об этом изменении.

Я сбросил настройки по умолчанию в ApplicationController:

class ApplicationController < ActionController::Base

  helper :all # include all helpers, all the time
  protect_from_forgery # See ActionController::RequestForgeryProtection for details

  helper_method :current_ability   #:current_contact

  def role?(base_role)
    ROLES.index(base_role.to_s) <= ROLES.index(role)
  end


  # = = = = = = = = = = = = logon controls = = = = = = = = = = = = = = = = = = =   
  private

    # Override default assumption by CanCan
    # https://github.com/ryanb/cancan/wiki/changing-defaults
    # in ApplicationController
    def current_ability
      @current_ability ||= Ability.new(current_contact)
    end  

    def require_contact
      unless current_contact
        redirect_to root_url, :notice => "You must be logged in to access this page."
        return false
      end
    end

    def current_contact_session
      return @current_contact_session if defined?(@current_contact_session)
      @current_contact_session = ContactSession.find
    end

    # return user model
    def current_contact
      return @current_contact if defined?(@current_contact)
      @current_contact = current_contact_session && current_contact_session.record
    end  

end

Роли и права определены в моем классе способностей, здесь:

class Ability
include CanCan::Ability

  # Role Inheritance
  # https://github.com/ryanb/cancan/wiki/Role-Based-Authorization
  # in Ability#initialize

  def initialize

    if @contact.role? :visitor
      can :read, [Home, Session]
    end

    if @contact.role? :camper
      can :read, [Home, Contact_session, Session]
      can :manage, Registration
    end

    if @contact.role? :admin
      can :manage, [Home, Contact_session, Contact, Session]
    end

    if @contact.role? :superadmin
      can :manage, :all
    end 

  end

end

И для чего это стоитНа данный момент я не добавил никакого кода ни к каким другим контроллерам (думая, что я решу, что делать, когда у меня есть возможность - методы, в которых я их хочу).

Есть идеи, что здесь не так?Я предполагаю, что неверное количество аргументов для чего-то вызванного банкой?метод в строке 12 зрения?Я перепробовал десятки альтернатив и породил множество других ошибок, но как только я их исправлю, я вернусь к этой.Будем благодарны за каждое предложение!

1 Ответ

1 голос
/ 09 августа 2011

Я понял это: метод Ability # initialize принимает аргумент, который является текущим объектом пользователя, и вы можете установить значение по умолчанию, если нет пользователя, вошедшего в систему, как этот (мой класс User заменен в этом приложении одним именем Contact):

def initialize (current_contact) current_contact || = Contact.create (: role => 'посетитель') # гость (не авторизован)

ТакжеЯ обнаружил, что мне не нужна роль?метод в ApplicationController, потому что довольно просто и точно указать разрешения явно и добавить к ним со временем, как это (в Ability # initialize):

if current_contact.role == 'superadmin'
  can :manage, :all
end 

if current_contact.role == 'admin'
  can :manage,

[Проживание, Каюта, Контакт,Идентификатор, Маршрут, Оплата, Резидент, Сессия, Спорт] end

if current_contact.role == 'camper'
  can :read, Session
  can [:read,:update], Registration #:active => true, :user_id =>

user.id, если это их собственный .... добавьте код для этой регистрации

 # A visitor can look around and register (but not manage

регистрации), еслиcurrent_contact.role == 'посетитель' может: прочитать, сеанс может: обновить, окончание регистрации

...