0

我是第一次探索 Rails,并尝试在我的测试应用程序中添加一些相当简单的基于角色的安全性。一些谷歌搜索似乎表明rails-authorization是解决这个问题的方法。我遵循了自述文件,一切似乎都很顺利,但现在我试图将 aUser与 a相关联,但Role它失败了。script/console这是我会议的片段:

>> u = User.find(:first)
=> #<User id: 1, login: "cwhit", name: "", email: "cwhitfield@unica.com", 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"

我只是在做一些愚蠢的事情,还是这是一个已知问题?我在插件的 Google Group 中的一个问题中发现了基本相同的错误rails-authorization,但没有提供解决方案。

这是我的基本配置:

  • 操作系统
  • 导轨 2.3.2
  • PostgresSQL
  • 插件:
    • 宁静认证
    • rails-授权
4

4 回答 4

1

在我使用“id”以外的主键的模型中遇到了同样的问题。原来我忘记使用“set_primary_key”在模型类定义中声明它。也许你需要做这样的事情:

class CulpritClass < ActiveRecord::Base

  set_primary_key :key_field_you_want

end
于 2009-04-25T18:30:38.700 回答
0

尝试安装composite_primary_keysgem (链接)并将以下内容添加到 RolesUser 控制器:

set_primary_keys :user_id, :role_id

由于该表没有 id 字段(并且不需要),(user_id, role_id)因此您可以将主键添加到数据库中

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

这解决了我的问题,这似乎是 Postgres 特有的。

于 2009-05-11T22:36:18.530 回答
0

我只是使用了两个主键声明

set_primary_key :user_id

set_primary_key :role_id

这适用于我的目的,但请记住,它返回(至少在 sql 中)您定义的第二个主键。在这种情况下,它将是对象的 role_id。

于 2009-06-25T22:20:35.220 回答
0

我遇到了同样的问题,但在销毁(角色)时。我尝试了composite_primary_keysgem,但发现它破坏了 Rails 2.3.4 中的其他东西。具体来说,它会导致 Rails:belongs_to关联在这种情况下生成错误的属性 id:

   belongs_to :inviter, :class_name => 'User'

它生user_id成为属性名称而不是inviter_id.

最终的解决方案是在roles_users 中添加一个id 列。因为我已经有一个没有代理键的角色用户表,所以我不得不进行这个 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
于 2009-12-03T23:56:04.530 回答