2009-03-27 4 views
0

J'explore Rails pour la première fois et j'essaie d'ajouter une sécurité basée sur les rôles relativement simple à mon application de test . Certains Googling semblait indiquer rails-authorization est le chemin à parcourir pour cela. J'ai suivi le README et tout semblait aller bien, mais maintenant j'essaie d'associer un User avec un Role et il échoue. Voici l'extrait de ma script/console session:'column' id "n'existe pas 'erreur lors de la tentative d'association d'un rôle avec un utilisateur utilisant rails-autorisation

>> u = User.find(:first) 
=> #<User id: 1, login: "cwhit", name: "", email: "[email protected]", crypted_password: "7ac064547fb8992e8e53e936df31657a40f9c5af", salt: "56671492059f8e40eb3d509940944aaba31ebc72", created_at: "2009-03-26 18:06:04", updated_at: "2009-03-26 18:06:04", remember_token: nil, remember_token_expires_at: nil> 
>> r = Role.find(:first) 
=> #<Role id: 1, name: "ProjectManager", authorizable_type: nil, authorizable_id: nil, created_at: "2009-03-27 11:02:35", updated_at: "2009-03-27 11:02:35"> 
>> u.has_role r 
ActiveRecord::StatementInvalid: PGError: ERROR: column "id" does not exist 
LINE 1: ....546623', '2009-03-27 11:42:16.546623', 5, 1) RETURNING "id" 
                   ^
: INSERT INTO "roles_users" ("created_at", "updated_at", "role_id", "user_id") VALUES('2009-03-27 11:42:16.546623', '2009-03-27 11:42:16.546623', 5, 1) RETURNING "id" 

que je fais juste quelque chose de stupide, ou est-ce un problème connu? J'ai trouvé essentially the same error dans une question dans le groupe Google pour le plugin rails-authorization, mais il n'y avait pas de solution fournie.

Voilà ma config de base:

  • OS X
  • Rails 2.3.2
  • PostGreSQL
  • Plugins:
    • authentification reposant
    • rails autorisation

Répondre

0

Essayez d'installer le bijou composite_primary_keys(link) et ajoutez ce qui suit au contrôleur RolesUser:

set_primary_keys :user_id, :role_id 

Comme il n'y a pas de champ id pour cette table (et là n'a pas besoin d'être), la clé primaire devient (user_id, role_id) que vous pouvez ajouter à la base de données avec

ALTER TABLE roles_users ADD PRIMARY KEY (user_id, role_id); 

Cette façon J'ai résolu le problème dans mon cas, ce qui semble être spécifique à Postgres.

1

Ran dans le même problème avec les modèles où j'utilisais une clé primaire autre que 'id'. Il s'avère que j'avais oublié de le déclarer dans la définition de classe de modèle en utilisant "set_primary_key". Peut-être que vous devez faire quelque chose comme ceci:

class CulpritClass < ActiveRecord::Base 

    set_primary_key :key_field_you_want 

end 
0

J'ai simplement utilisé deux déclarations clés primaires

set_primary_key :user_id 

set_primary_key :role_id 

Cela a fonctionné pour mes fins, mais gardez à l'esprit qu'il retourne (dans le sql au moins) la deuxième clé primaire que vous définissez. Dans ce cas, ce serait le role_id de l'objet.

0

J'ai eu le même problème mais sur détruire (des rôles). J'ai essayé la gemme composite_primary_keys mais j'ai trouvé que ça cassait d'autres choses dans Rails 2.3.4. Plus précisément, il a causé Rails :belongs_to association pour générer le tort attribué id dans cette situation:

belongs_to :inviter, :class_name => 'User' 

Il générait user_id comme le nom d'attribut au lieu de inviter_id.

La solution ultime consistait à ajouter une colonne id à roles_users.Depuis que j'avais déjà une table roles_users sans clé de substitution je devais faire cette migration lil:

class AddIdToRolesUsers < ActiveRecord::Migration 
    def self.up 

     # create new table the way it should be (_with_ a traditional Rails id column) 
     create_table :x_roles_users do |t| 
     t.belongs_to :role 
     t.belongs_to :user 
     t.timestamps 
     end 

     execute 'insert into x_roles_users (user_id, role_id, created_at, updated_at) select * from roles_users' 

     drop_table :roles_users 

     rename_table :x_roles_users, :roles_users 
    end 

    def self.down 
     remove_column :roles_user, :id 
    end 
    end 
+0

BTW ce problème avec 'composite_primary_keys' est bien connu et un patch est disponible pour deux années complètes. Malheureusement, le patch n'a pas été roulé dans la gemme. http://groups.google.com/group/compositekeys/browse_thread/thread/502e6b0d77cac8c9/682eb7545d01b141 –

Questions connexes