質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

1回答

3233閲覧

アソシエーションの片方だけreadonlyとした場合の、Rails 4と5での動作の違い

maisumakun

総合スコア145183

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

1クリップ

投稿2016/10/21 08:14

##状況
Rails 5でアプリを開発するにあたって、Rails 4と同様な書き方をしたところ、うまく動かなくなり、どうすればいいのか悩んでいます。

###該当のソースコード

ユーザーと権限がある(多対多)、という状況で、権限の項目自体はふつう増減させないので、activerecord-be_readonlyGitHub)を使って読み取り専用にしています。

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?関連の制御で発生しているようです。

質問内容

  1. (できれば)Rails 4と同様にuser[role_ids][]を投げるだけできちんと更新できる方法はないか
  2. 次善の策として、コールバックなどにコードを追加しなくて済むような更新方法

(なお、「readonlyを完全に外す」ということは考えていません。)

##試したこと

  • has_manybelongs_toautosave: falseのオプションを追加する
  • Role側からのアソシエーションを削除する

また、RoleUserを直接追加することは可能でした。

##補足情報(言語/FW/ツール等のバージョンなど)

  • Rails 5.0.0.1 + MySQL 5.x
  • activerecord-be_readonly 0.3.0
  • simple_form 3.3.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

view経由でのテストは行なっていませんが、私の検証では下記にて解決しました。

  • Rails5.0.2 へのバージョンアップ

または、

  • rolesへのhas_manyautosave: falseのオプションを追加(workaround)

ruby

1class User 2 has_many :role_users 3 has_many :roles, through: :role_users, autosave: false 4end

詳しくはこちら(qiita)に書きました。
PoCはこちら(github)です。

ただし、すでに

  • has_manybelongs_toautosave: falseのオプションを追加する

のworkaroundを試されたとのことですので、もしかしたら別の事象かもしれません。

投稿2017/03/12 13:15

moperon

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問