paramsからストロングパラメータを通して値を取得したいのですが、newを行った時にnil
となってしまい、ネストされた要素の値が取得できません。
商品登録を行う処理でhas_many
でincludes
させた商品カテゴリーテーブルをネストしています。
カテゴリーはプルダウンメニューで選択するのですが、そのvalue(テーブルでいうところのid)が取得できません。
ストロングパラメータの書き方を色々変えてもできず、どのようにしたら、ストロングパラメータを通して取得できるのでしょうか?それとも、別の取得方法をするのでしょうか?
教えていただければ助かります。
テーブルの関係は、
productcategory 1対多 product
paramsの中身
Parameters: { "utf8"=>"✓", "authenticity_token"=>"", "product"=>{ "product_name"=>"商品名", "productcategories"=>{ "productcategory_id"=>"2" } }, "commit"=>"商品を追加する" }
取得できない要素は、カテゴリーテーブルのproductcategory_id
です。
product_controller.rb
def product_params product_params = params.require(:product).permit(:id, :product_name, productcategories: [:productcategory_id]) end
モデル
product.rb
class Product < ApplicationRecord has_many :productcategories validates_associated :productcategories accepts_nested_attributes_for :productcategories end
productcategory.rb
class Productcategory < ApplicationRecord belongs_to :poduct accepts_nested_attributes_for :product end
コントローラ
def new @product = Product.new @category = Productcategory.new end def create @product = Product.new(product_params) respond_to do |format| if @product.save! format.html { redirect_to @product, notice: '商品の追加完了' } format.json { render :show, status: :created, location: @product } else format.html { redirect_to new_product_url } format.json { render json: @product.errors, status: :unprocessable_entity } end end end private def product_params product_params = params.require(:product).permit(:productname, productcategories: [:productcategory_id]) end
@productをデバッグしてみると
<Product id: 5, productname: "商品名A", productcategory_id: nil>
nilとなって取得できていません。
view
カテゴリーはプルダウンメニューから選びます。
products/new.html.erb
<%= form_for @product do |f| %> <p><%= f.text_field :productname, placeholder: '商品名を入力', autocomplete: 'off' %></p> <%= f.fields_for :productcategories do |c| %> <p><%= c.collection_select :productcategory_id, Productcategory.all, :id, :category, prompt: 'カテゴリーを選択' %></p> <% end %> <div class="formsubmit"><%= f.submit '商品を追加する' %></div> <% end %>
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。