0

この Rails 3.2 アプリケーションは正常に動作しています。以下の手順に従ってRolifyをインストールしました。

  1. gem "rolify"Gemfileに追加する
  2. 走るbundle install
  3. 走るrails g rolify:role
  4. 新しい移行、新しいファイル、および変更されたファイル (上記のコマンドによって生成/変更された) を確認します。
  5. 走るrake db:migrate

この時点で、ユーザーを作成/編集しようとすると、次のエラーが発生します。

NoMethodError in UsersController#create

undefined method `user_id' for #<User:0x007f8f21f168e8>

Rolify をインストールする前は、すべて正常に動作していたので、問題は Rolify にあることに注意してください。

問題の移行、新しいファイル、および変更されたファイルは次のとおりです。

新しい移行:

class RolifyCreateRoles < ActiveRecord::Migration
  def change
    create_table(:roles) do |t|
      t.string :name
      t.references :resource, :polymorphic => true

      t.timestamps
    end

    create_table(:users_roles, :id => false) do |t|
      t.references :user
      t.references :role
    end

    add_index(:roles, :name)
    add_index(:roles, [ :name, :resource_type, :resource_id ])
    add_index(:users_roles, [ :user_id, :role_id ])
  end
end

新しいモデル:

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users, :join_table => :users_roles
  belongs_to :resource, :polymorphic => true
end

変更されたモデル:

class User < ActiveRecord::Base
  rolify
  has_secure_password

  has_many :issues
  acts_as_tenant(:client)

  attr_accessible :email, :password, :password_confirmation, :username

  validates :username, presence: true,
                       length: { within: 4..50 },
                       format: { with: /(?:[\w\d]){4,255}/ }
  validates_uniqueness_to_tenant :username, case_sensitive: false

  validates :email, presence: true,
                    uniqueness: { case_sensitive: false },
                    length: { within: 8..255 },
                    format: { with: /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i }

  validates :password, presence: true, on: :create,
                       confirmation: true,
                       length: { within: 4..255 }

  validates :password_confirmation, presence: true, on: :create

  # NOTE: Used by SimpleForm to display the dropdown proerply
  def to_label
    "#{username}"
  end
end

プロジェクトの残りのファイルは、Github リポジトリにあります。

エラーがどこから来たのか、誰にも手がかりがありますか?

4

1 に答える 1

3

このエラーは、acts_as_tenant が (誤って) モデルのuser_idフィールドの検証を作成しているために発生していますUser。内部でこのコードを実行すると、このバリデータが表示されますrails c

 User._validators

act_as_tenant よりもメンテナンスが行き届いているように見えるアパートメントgemに切り替えることをお勧めします。

于 2012-07-24T22:52:05.563 に答える