railsで
userある決まった商品のなかからどの商品を扱うかを決めて、その商品に値段をつけるとします。
モデルは
userモデル・user_product_categoryモデル・product_categoryモデル
という3つのモデルが有り、user_product_categoryモデルはpriceというカラムを持っています。
そしてuser_product_categoryコントローラのcreateではproduct_categoryモデルの一覧があり、そこにチェックボックスをつけて値段を入れるとユーザープロフィールページに表示されるようにしたいです。
条件としては
1・どの商品を取り扱うか、取り扱わないかをユーザープロフィール編集ページではない1ページで更新したい。(中間テーブルのみを一括更新したい。)
2・値段もそのページで変更可能にしたい。
この時どのようにformを作ったりコントローラを書けばよいでしょうか。
調べて、
<% ProductCategory.all.each do |product_category| %>
<%= check_box_tag "user[product_category_ids][]", product_category.ids, f.object.product_categories.include?(product_category) %>
とやることでチェックボックスがついたものだけparamsに入れられるのはわかってきたのですが、これだと複数一括で登録する場合バリデーションが一括出できない気がして・・・
また、ユーザーモデルとひも付けて
def user_params
params.require(:user).permit(:name,{product_category: [] })
end
でユーザーごとsaveすればいいとも書いてあったのですが、これだとpriceカラムをどのように入れればいいのかわからないというのがありまして・・・
何解決策はないか教えて下さい。お願いします。
追記
Userモデルははusernameカラムを持ち
has_many :user_product_category
has_many :product_category through: :user_product_category
user_product_categoryは
belongs_to :users
belongs_to :product_category
でカラムとしては
user_id, :integer
product_category_id, :integer
price, :integer
product_categoryはnameカラムをもっていて
has_many :user_product_category
has_many :users through: :user_product_category
を持っている状態です
createメソッドについてやりたいことは
1・まず、ProductCategories.allで手に入る全製品カテゴリ名をチェックボックスで表示
2・checkboxの横に数字を入れるテキストフィールドがありpriceを入力する
3・更新を押すとuser_product_categoryコントローラにparamsが飛んで
checkboxがついてる製品カテゴリの中間テーブルを生成。
checkboxがあったが外れたものについては削除。
さらにpriceフィールドのバリデーションをする
例えば
user_id=1のユーザーAがおり
製品カテゴリ1(id=1)
製品カテゴリ2(id=2)
製品カテゴリ3(id=3)
があるとして
ユーザーAは最初に製品カテゴリ1にチェックし、1000円と入力する
↓
user_product_categoryテーブルで
id=1
user_id=1
product_categories_id=1
price=1000
というレコードが生成される
次にユーザーAは製品カテゴリ1のチェックを外し、製品カテゴリ2と製品カテゴリ3のチェックを付け、両方共にprice=1200を入力し更新ボタンを押す
↓
user_product_categoryテーブルで
id=1のレコードはチェックが外れたので削除
id=2
user_id=1
product_categories_id=2
price=1200
id=3
user_id=1
product_categories_id=3
price=1200
というレコードが生成される
こんな感じにしたいです。
ただこの時strong parameterはどのように書くのかとかどうやって一括でpriceフィールドのバリデーションするかとか全く思いつきませんでした。
いい方法があったら教えて頂きたいです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
参考情報
- Nested model (attributes)とは http://qiita.com/onelittlenightmusic/items/bfb20c481e6c4970f415
...
Railsの超便利機能で、親と子の関係もしくはhas one関係を"nested"と指定することで、
親を作成時に同時に子も作成してしまうことができる。
...
- 1対多のリレーションモデルと入れ子フォームの実装のポイント https://www.d-wood.com/blog/2017/01/27_8770.html
...
- Railsでaccepts_nested_attributes_forとfields_forを使ってhas_many関連の子レコードを作成/更新するフォームを作成 http://ruby-rails.hatenadiary.com/entry/20141208/1418018874
ここらあたりを起点に、調査していくとよいと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-2
それぞれのクラスについてもう少しわかりやすく記述してもらえると助かります
userモデル
user_product_categoryモデル
product_categoryモデル
それぞれのモデルのカラムについてと、createメソッド、ストロングパラメーター等の追記をお願いします
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる