0

私はこれに対する解決策を見つけようとしましたが、関連するほとんどの文献には、DB にデータを保存する方法ではなく、フォームを作成する方法が含まれています。私が抱えている問題は、accepts_nested_attributes_for既存の DB エンティティへの変更を保存するときは問題なく動作するように見えますが、新しいオブジェクト ツリーを作成しようとすると失敗することです。

いくつかの背景。私のクラスは次のとおりです。

class UserGroup < ActiveRecord::Base
    has_many :permissions
    has_many :users

    accepts_nested_attributes_for :users
    accepts_nested_attributes_for :permissions
end

class User < ActiveRecord::Base
    has_many :user_permissions
    has_many :permissions, :through => :user_permissions

    belongs_to :user_group

    accepts_nested_attributes_for :user_permissions
end

class Permission < ActiveRecord::Base
    has_many :user_permissions
    has_many :users, :through => :user_permissions

    belongs_to :user_group
end

class UserPermission < ActiveRecord::Base
    belongs_to :user
    belongs_to :permission

    validates_associated :user
    validates_associated :permission

    validates_numericality_of :threshold_value
    validates_presence_of :threshold_value

    default_scope order("permission_id ASC")
end

パーミッションは奇妙に思えますが、それぞれにユーザーごとに異なるthreshold_valueがあるため、このように必要です。

とにかく、私が言ったようにPUT、たとえばしきい値を更新すると、すべてが正常に機能します。これはコントローラー コードです (UserGroupController、一度に 1 人のユーザーではなくユーザー グループ全体を投稿しています)。

def update
    @ug = UserGroup.find(params[:id])
    @ug.update_attributes!(params[:user_group])
    respond_with @ug
end

入ってくる典型的なデータは次のとおりです。

{"user_group":
    {"id":3,
    "permissions":[
        {"id":14,"name":"Perm1"},
        {"id":15,"name":"Perm2"}],
    "users":[
        {"id":7,"name":"Tallmaris",
         "user_permissions":[
             {"id":1,"permission_id":14,"threshold_value":"0.1"},       
             {"id":2,"permission_id":15,"threshold_value":0.3}]
        },
        {"name":"New User",
         "user_permissions":[
             {"permission_id":14,"threshold_value":0.4},
             {"permission_id":15,"threshold_value":0.2}]
        }]
    }
}

ご覧のとおり、「新しいユーザー」には ID がなく、すべてを作成する必要があるため、彼の権限レコードにも ID はありません。「Tallmaris」ユーザーは問題なく動作し、変更された値は問題なく更新されます (UPDATE sql がサーバーによって実行されていることがわかります)。それどころか、新しいユーザーは私にこの厄介なログを与えます:

[...]
User Exists (0.4ms)  SELECT 1 AS one FROM "users" WHERE "users"."name" = 'New User' LIMIT 1
ModelSector Load (8.7ms)  SELECT "user_permissions".* FROM "user_permissions" WHERE (user_id = ) ORDER BY permission_id ASC
PG::Error: ERROR:  syntax error at or near ")"

もちろん、ユーザーが存在しないため、エラーは明らかに(user_id = )何もありません.user_permissionsはまだ設定されておらず、その場で作成したかったのです。

4

1 に答える 1

0

この他の質問を見回したおかげで、ユーザーの検証に問題があることがわかりました。基本的に、threshold_values が特定の制約内で合計されることを検証していましたが、それを行うには、おそらく何か間違ったことをしており、Rails が DB からデータをロードしていたため、既存の値には問題ありませんでしたが、もちろん新しい値には何もありませんでした。

私はそれを修正し、現在は機能しています。これは、ある場所の問題には別の場所から解決策がもたらされることが多いことを思い出させるため、ここに残しておきます。:)

于 2012-11-08T12:29:49.587 に答える