Ruby on Rails, Cancan kan niet werken

Ik probeer Cancan de hele dag te laten werken. Ik ben verschillende keren met verschillende tutorials begonnen, maar ik krijg steeds dezelfde fouten.

Het is vrij eenvoudig, ik heb een gebruikersaccount (gemaakt met Devise) dat één rol kan hebben, ofwel Admin of Gebruiker. Hier is de bekwaamheidsklasse:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new
    if user.role? :admin
      can :manage, :all
    end
  end
end

In de profielcontroller heb ik de regel load_and_authorize_resource , de klasse Gebruiker bevat ROLES =% w [admin user] . Als ik ga naar http://localhost: 3000/profiles/, krijg ik de foutmelding

wrong number of arguments (2 for 1) in app/models/ability.rb:6:ininitialize'`

Met behulp van de alternatieve methode user.admin? geeft

undefined method `admin?' for #

Googling the error above gives many results so I'm not the only person having this problem, but none of the solutions have worked for me.

And yes I have added the role column to the User table

class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :string
  end
end

added the Gem, ran bundle install and restarted the server.

1
ja ru de
dus weet je zeker dat je deze rol? en admin? methoden hebt?
toegevoegd de auteur Vasiliy Ermolovich, de bron
dus controleer het als als user.role == 'admin' CanCan maakt geen speciale methoden voor u
toegevoegd de auteur Vasiliy Ermolovich, de bron
Ja, maar het feit dat u over de nodige databasekolommen beschikt, betekent niet dat u automatisch de methoden admin? of rol? gebruikt. U moet ze zelf definiëren.
toegevoegd de auteur Jesper, de bron
De gebruikerstabel heeft een rolkolom. Ik zou user.role moeten kunnen doen om de rol te krijgen. Ik heb de Wiki gelezen op cancan en het zou moeten werken zonder methoden te definiëren github.com/ ryanb/cancan/wiki/Role-Based-Authorization
toegevoegd de auteur hugh, de bron
@nash Van rails console als User.first.role == "admin" zet "user is admin" end - geeft "user is admin"
toegevoegd de auteur hugh, de bron

1 antwoord

Als je het volgende hebt, zou dit moeten werken:

Ability.rb

class Ability
  include CanCan::Ability
  def initialize(user)
    user ||= User.new # guest user
   # raise user.role?(:administrator).inspect
    if user.role? :administrator

      can :manage, :all
      can :manage, User

    elsif user.role? :user
      can :read, :all

    end

  end
end

RoleUser.rb

class RoleUser < ActiveRecord::Base
  # attr_accessible :title, :body
  belongs_to :user
  belongs_to :role

end

Role

class Role < ActiveRecord::Base
  attr_accessible :name

  has_and_belongs_to_many :users
end

User.rb

 class User < ActiveRecord::Base

 has_and_belongs_to_many :roles

  def role?(role)
    self.roles.find_by_name(role.to_s.camelize)
  end

Je hebt dit nodig omdat je je rollen definieert, ze vindt, de rol omzet in een string en deze cameliseert.

seeds.rb

%w(Employee Administrator).each { |role| Role.create!(:name => role)}

maakt een array gebruiker en beheerder .

Als u deze stappen correct zou uitvoeren, zou dit moeten werken. En zorg er ook voor dat u de volgende migraties heeft:

class UsersHaveAndBelongsToManyRoles < ActiveRecord::Migration
  def self.up
    create_table :roles_users, :id => false do |t|
      t.references :role, :user
    end
  end

  def self.down
    drop_table :roles_users
  end
end

Gebruik dan in uw ogen de can? door iets als te doen

<% if can? :manage, User %> 
  .......
    ....
  ...
<% end %> 
0
toegevoegd