0

私は初めて Rails を調査しており、かなり単純な役割ベースのセキュリティをテスト アプリに追加しようとしています。一部のグーグルは、レール認証がこれを行う方法であることを示しているようです。私はREADMEに従いましたが、すべてうまくいっているように見えましたが、今 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 グループの質問で本質的に同じエラーを見つけましrails-authorizationたが、解決策はありませんでした。

これが私の基本的な設定です:

  • OS X
  • レール 2.3.2
  • PostgreQL
  • プラグイン:
    • 安らかな認証
    • レール認可
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

私は単に2つの主キー宣言を使用しました

set_primary_key :user_id

set_primary_key :role_id

これは私の目的のために機能しましたが、定義した2番目の主キーを(少なくともSQLで)返すことに注意してください。この場合、それはオブジェクトの role_id になります。

于 2009-06-25T22:20:35.220 に答える
0

私は同じ問題を抱えていましたが、(役割の)破壊時に発生しました。この gemを試してcomposite_primary_keysみましたが、Rails 2.3.4 では他の機能が壊れていることがわかりました。具体的には、この状況で Rails:belongs_to関連付けが間違った属性 ID を生成する原因となっていました。

   belongs_to :inviter, :class_name => 'User'

user_idではなく属性名として生成していましたinviter_id

最終的な解決策は、id 列を roles_users に追加することでした。私はすでに代理キーのないroles_usersテーブルを持っていたので、この小さな移行をしなければなりませんでした:

  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 に答える
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 に答える