0

次のエラーが表示されます。

保護された属性を一括で割り当てることはできません: 管理者、学生

次のseed.rbファイルでrake db:seedコマンドを実行すると:

roles = [
    Admin: 'Unlimited Access',
    Student: 'Default user role for each user created by sign-in interface.'
]

roles.each do |role, description|
  SecurityUsersRole.find_or_create_by_role_and_description(role,description)
end

私のモデルは次のようになります:

class SecurityUsersRole < ActiveRecord::Base

  # Accessible columns
  attr_accessible :description,
                  :role

  # Relationships
  ...

  # Validations
  validates :description, presence: true, length: { in: 4..32 }, uniqueness: true
  validates :role, length: {  maximum: 256 }, presence: true

end

私はこれについて多くのことを読みましたが、最新のレール バージョンでは、次のようなハッカーの攻撃を防ぐためにオフにすると、一括割り当てがオフになっているようです。

def signup
  params[:user] # => {:name => “ow3ned”, :admin => true}
  @user = User.new(params[:user])
end

これについては SO の質問がたくさんあり、答えは常に attr_accessible をフィールドに設定することですが、私はすでにこれを行っています。

編集:

次の構文 ( []の代わりに{} ) を使用している場合、最初のペアが追加されます。

roles = {
    Admin: 'Unlimited Access',
    Student: 'Default user role for each user created by sign-in interface.'
}

これを行っても何も変わりません:

SecurityUsersRole.find_or_create_by_role_and_description('Admin','Unlimited Access')
SecurityUsersRole.find_or_create_by_role_and_description('Student','Default user role for each user created by sign-in interface.')

いくつか読んだ後、Rails 4.0 ではfind_or_create_by ヘルパーが廃止されたようですRails 3.2 を使用していますが、他の手法も試すことにしました。

roles = {
    Admin: 'Unlimited Access',
    Student: 'Default user role for each user created by sign-in interface.',
    Test:'wtf'
}

roles.each do |role, description|
  SecurityUsersRole.where(role:role,description:description).first_or_create
  #puts role
  #puts description
end

上記のステートメントはまだ最初のレコードのみを作成しています。Railsコンソールでステートメントを実行することにしました。これが得られる出力です。

  SecurityUsersRole Load (5.0ms)  SELECT security_users_roles.* FROM security_users_roles WHERE security_users_roles.role = 'Admin' AND security_users_roles.description = 'Unlimited Access' FETCH FIRST ROW ONLY
  SecurityUsersRole Load (3.0ms)  SELECT security_users_roles.* FROM security_users_roles WHERE security_users_roles.role = 'Student' AND security_users_roles.description = 'Default user role for each user created by sign-in interface.' FETCH FIRST ROW ONLY
  SecurityUsersRole Exists (1.0ms)  SELECT 1 AS one FROM security_users_roles WHERE security_users_roles.description = 'Default user role for each user created by sign-in interface.' FETCH FIRST ROW ONLY
  SecurityUsersRole Load (1.0ms)  SELECT security_users_roles.* FROM security_users_roles WHERE security_users_roles.role = 'Test' AND security_users_roles.description = 'wtf' FETCH FIRST ROW ONLY
  SecurityUsersRole Exists (1.0ms)  SELECT 1 AS one FROM security_users_roles WHERE security_users_roles.description = 'wtf' FETCH FIRST ROW ONLY
=> {:Admin=>"Unlimited Access", :Student=>"Default user role for each user created by sign-in interface.", :Test=>"wtf"}

何が起こっているのか正確には理解できませんが、コンソールからすべてのユーザーを選択すると、最初のユーザーのみが返されます。では、他のロールが検索された場合、なぜそれらが存在しないのに作成されないのでしょうか?

誰が私が試すことができるかアドバイスできますか?

4

1 に答える 1

0

この問題は、モデルの検証ルールが原因でした。

  # Validations
  validates :description, presence: true, length: { in: 4..32 }, uniqueness: true
  validates :role, length: {  maximum: 256 }, presence: true

する必要があります

  # Validations
  validates :role, presence: true, length: { in: 4..32 }, uniqueness: true
  validates :description, length: {  maximum: 256 }, presence: true

:roleフィールドと:descriptionフィールドの場所を変更しました。そのため、rake db:seedコマンドは最初のレコードを挿入しますが、2 番目のレコードでエラーが表示され、挿入が中止されます。その結果、常に最初のレコードがインポートされました。

シードを使用しているときに検証エラーを取得するには、次のような !method バージョンを使用する必要があります。

SecurityUsersRole.where(role:role,description:description).first_or_create!
于 2013-06-25T08:08:19.860 に答える