##状況
Rails 5でアプリを開発するにあたって、Rails 4と同様な書き方をしたところ、うまく動かなくなり、どうすればいいのか悩んでいます。
###該当のソースコード
ユーザーと権限がある(多対多)、という状況で、権限の項目自体はふつう増減させないので、activerecord-be_readonly
(GitHub)を使って読み取り専用にしています。
ruby
1class User 2 has_many :role_users 3 has_many :roles, through: :role_users 4end 5 6class RoleUser 7 belongs_to :user 8 belongs_to :role 9end 10 11class Role 12 be_readonly 13 has_many :role_users 14 has_many :users, through: :role_users 15end
このような状況で、(strong_parametersももちろん通した上で)フォームからuser[role_ids][]
を送信してUser#update
を行ったところ、Rails 4では問題なく動くのですが、Rails 5ではRole
に対してActiveRecord::ReadOnlyRecord
の例外が出てしまいました。例外自体はactiverecord-be_readonly
ではなくActiveRecord側から発生しているので、標準のreadonly?
関連の制御で発生しているようです。
質問内容
- (できれば)Rails 4と同様に
user[role_ids][]
を投げるだけできちんと更新できる方法はないか - 次善の策として、コールバックなどにコードを追加しなくて済むような更新方法
(なお、「readonlyを完全に外す」ということは考えていません。)
##試したこと
has_many
やbelongs_to
にautosave: false
のオプションを追加するRole
側からのアソシエーションを削除する
また、RoleUser
を直接追加することは可能でした。
##補足情報(言語/FW/ツール等のバージョンなど)
- Rails 5.0.0.1 + MySQL 5.x
- activerecord-be_readonly 0.3.0
- simple_form 3.3.1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。