collection_check_boxesを用いてgroupを作り、中間テーブルのレコードを作成したい
解決済
回答 1
投稿
- 評価
- クリップ 3
- VIEW 3,049
前提・実現したいこと
ruby on railsであるグループを作る際に、そのグループにuserも登録して、そのグループにどのユーザーが属しているかをaccepts_nested_attributes_forを使って中間テーブルに登録したいです。
具体的にはビューにチェックボックスを作ってそこからグループに登録したいユーザーを選びます
チェックボックスは
f.collection_check_boxes :user_ids, User.all, :id, :name
を用いて作りました。
例えばすべてのユーザーにチェックを入れてSENDするとユーザのidが7,8,9としてparamasが
params.require(:group).permit(:name, user_ids:[])
=> {"name"=>"テストグループ", "user_ids"=>["","7", "8", "9"]}
という風に取得することはできました。
user_idsの配列に""と空になっているものが送られてきてるのはcollection_check_boxesの仕様のようです 参考記事
このテストグループという名前のグループ(id 10として)をgroupテーブルに保存しつつ、
accepts_nested_attributes_forを用いてusers_groupsテーブルに
groups table
id | name |
---|---|
10 | テストグループ |
users_groups table
id | group_id | user_id |
---|---|---|
1 | 10 | 7 |
2 | 10 | 8 |
3 | 10 | 9 |
と保存したいのですが、コントローラーにどのように書けばいいのかがわかりません。
教えていただけないでしょうか?
テーブルとモデル
users table
column | type |
---|---|
name | string |
string | |
password | string |
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
#association
has_many :users_groups
has_many :groups, through: :users_groups
end
groups table
column | type |
---|---|
name | string |
class Group < ApplicationRecord
#association
has_many :users_groups
has_many :users, through: :users_groups
accepts_nested_attributes_for :users_groups
end
users_groups table
column | type |
---|---|
user_id | references |
group_id | references |
class UsersGroup < ApplicationRecord
#association
belongs_to :user
belongs_to :group
end
補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
rails 5.0.0
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
コントローラーでは、Strong parametersを書くだけです。あと、accepts_nested_attributes_for
にはallow_destroy: true
を付けておきましょう(そうしないと、追加したusers_groups
が消えなくなります)。
class GroupsController
# コントローラーのメイン部分は省略
private
def group_params
params(:group).permit(user_ids: [], 'あとは適宜他のパラメーターを続ける')
end
end
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/04/07 00:00
strong parameterでの受け取り方はわかるのですが、createアクション内で、どのようにして質問のようにgroupテーブルに保存すと同時に、users_groupsテーブルにレコードを作成するのかをご教授いただけると幸いです。
回答して下さったところでいうと、省力されたところにどのように記述すればいいのでしょうか?
2017/04/07 08:41
2017/04/08 16:32
あとはuser_idをちゃんと保存するようにコントローラに書いたらうまく行きました。
ありがとうございました!