質問編集履歴

2 内容の修正

ken0625

ken0625 score 40

2017/03/07 19:11  投稿

Railsで多対多モデルの中間テーブルを一括登録・編集したい
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モデルは
Userモデルははusernameカラムを持ち
```ここに言語を入力
has_many :user_product_category
has_many :product_category through: :user_product_category
```
user_product_categoryはusernameカラムを持ち
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フィールドのバリデーションするかとか全く思いつきませんでした。
いい方法があったら教えて頂きたいです。
  • Ruby

    13827 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    14322 questions

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

  • Ruby on Rails 4

    2643 questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

1 詳細説明を追記

ken0625

ken0625 score 40

2017/03/07 12:53  投稿

Railsで多対多モデルの中間テーブルを一括登録・編集したい
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モデルは
```ここに言語を入力
has_many :user_product_category
has_many :product_category through: :user_product_category
```
user_product_categoryはusernameカラムを持ち
```ここに言語を入力
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フィールドのバリデーションするかとか全く思いつきませんでした。
いい方法があったら教えて頂きたいです。
  • Ruby

    13827 questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    14322 questions

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

  • Ruby on Rails 4

    2643 questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る