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

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

ただいまの
回答率

89.08%

[Rails5]ストロングパラメータでパラメーターを許可しているのにも関わらずUnpermitted parameters:が出てしまう。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,135

yuukihayashi

score 123

前提・実現したいこと

あるフリマアプリのクローンを作成しています。
商品出品ページを作成している段階です。
配送料が着払いか、元払いかによって配送方法の種類が変わるといった処理をajaxとjqueryを使用して実現しています。
上記の動的にセレクトボックスの中身を変更する処理はできています。
Productというモデルにdelivery_fee_owner_idというカラムを追加して、着払いか、元払かをcollection_selectで選択させてストロングパラメーターを使用して、delivery_fee_owner_idを許可しているのですが、なぜか
Unpermitted parameters:となってしまい、ROLLBACKしていまいます。

なぜパラメーターを許可しているのにUnpermitted parameters:となってしまうのか、ご教示いただきたく思います。

発生している問題・エラーメッセージ

Started POST "/sells" for 127.0.0.1 at 2019-04-04 00:29:30 +0900
Processing by SellsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"T3VM0FzDui3t+TU5oErMvEuPsSGjdtwOGxp2TDR04jEuBvxjl5x33nxoaHHujsvdDGPQi/mwjfGpgUWvfpsdJQ==", "image1"=>"", "product"=>{"name"=>"aaaaaa", "info"=>"aaaaaaaaaaa", "status"=>"新品未使用", "delivery_fee_owner_id"=>"1", "price"=>"2000"}, "shipping_method"=>"1", "commit"=>"出品する"}
Unpermitted parameters: :name, :info, :status, :delivery_fee_owner_id, :price
   (4.9ms)  BEGIN
  ↳ app/controllers/sells_controller.rb:14
  DeliveryFeeOwner Load (3.5ms)  SELECT  `delivery_fee_owners`.* FROM `delivery_fee_owners` WHERE `delivery_fee_owners`.`id` = 1 LIMIT 1
  ↳ app/controllers/sells_controller.rb:14
   (0.2ms)  ROLLBACK
  ↳ app/controllers/sells_controller.rb:14
Redirected to http://0.0.0.0:3001/
Completed 302 Found in 18ms (ActiveRecord: 8.6ms)

該当のソースコード

class SellsController < ApplicationController
  def index
  end
  def new
    @sell = Product.new
    @shipping_method = ShippingMethod.new
  end

  def create
    @sell = Product.new(sell_params)
    @shipping_method = ShippingMethod.new(shipping_method_params)
    if @sell.save && @shipping_method.save
      redirect_to sell_path(@sell)
    else
      redirect_to root_path
    end
  end

  def shipping_method
    render partial: 'sells/shipping_method', locals: { delivery_fee_owner_id: params[:delivery_fee_owner_id] }
  end

  private

  def sell_params
    params.require(:product).permit(:delivery_fee_owner_id, :name, :info, :price, :status)
  end
  def shipping_method_params
    params.require(:product).permit(:shipping_method_id)
  end
end
%main.single-main
  %section.sell-container
    .sell-container__inner
      %h2.single-container__head
        商品の情報を入力
      = form_with model: @sell,url:sells_path, class:"sell-container__form", local:true do |f|
            = f.label "商品名"
            = f.text_field :name,class: "sell-content__input input-default", placeholder: "商品名(必須 40文字まで)"
            = f.label "商品の説明"
            = f.text_area :info,class:"sell-content__desc_textarea textarea-default",rows:"5" ,placeholder:"商品の説明(必須 1,000文字以内)(色、素材、重さ、定価、注意点など)例)2010年頃に1万円で購入したジャケットです。ライトグレーで傷はありません。あわせやすいのでおすすめです。"
            = f.label "カテゴリー"
            = f.label "商品の状態"
            = f.select :status, Product.statuses.keys, {}, class: "sell-content__select-default"
            = f.label "配送料の負担"
            = f.collection_select :delivery_fee_owner_id, DeliveryFeeOwner.all,:id, :delivery_fee_owner, {prompt: "---"},{class:"sell-content__select-default",id:"delivery_fee_owner"
            //jqueryで:delivery_fee_ownersの値によって表示するセレクトボックスを変動させる。
            = f.label "配送の方法"
            = render partial: 'shipping_method',locals: {delivery_fee_owner_id: DeliveryFeeOwner.first.id}
            = f.label "価格"
            = f.text_field :price, class:"input-default",placeholder:"例)300"
            = f.submit "出品する" ,class:"sell-content__btn-red"
$(document).on 'change', '#delivery_fee_owner', ->
  $.ajax(
    type: 'GET'
    url: '/sells/shipping_method'
    data: {
      delivery_fee_owner_id: $(this).val()
    }
  ).done (data) ->
    console.log(data)
    $('.shipping-method').html(data)
Rails.application.routes.draw do

  root 'products#index'
  devise_for :users
  resources :users, only: [:show]
  resources :products
  resources :sells do
    get 'shipping_method', on: :collection
  end
  resources :buys
end

試したこと

rails console上では当たり前ですが追加できました。

[[Airb(main):001:0> product = Product.new(name:"test",price:200,info:"test",shipping_method_id:1,delivery_fee_owner_id:1)
   (0.9ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
=> #<Product id: nil, name: "test", created_at: nil, updated_at: nil, price: 200, info: "test", status: nil, shipping_method_id: 1, delivery_fee_owner_id: 1>
irb(main):002:0> product.save
   (0.2ms)  BEGIN
  DeliveryFeeOwner Load (0.4ms)  SELECT  `delivery_fee_owners`.* FROM `delivery_fee_owners` WHERE `delivery_fee_owners`.`id` = 1 LIMIT 1
  ShippingMethod Load (0.2ms)  SELECT  `shipping_methods`.* FROM `shipping_methods` WHERE `shipping_methods`.`id` = 1 LIMIT 1
  Product Create (34.1ms)  INSERT INTO `products` (`name`, `created_at`, `updated_at`, `price`, `info`, `shipping_method_id`, `delivery_fee_owner_id`) VALUES ('test', '2019-04-03 15:53:25', '2019-04-03 15:53:25', 200, 'test', 1, 1)
   (4.6ms)  COMMIT
=> true

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

Rails 5.2.2
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin18]
mac os mojave 10.14(18A391)

お手数かけますが、お願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

Parameters: {"utf8"=>"✓", "authenticity_token"=>"T3VM0FzDui3t+TU5oErMvEuPsSGjdtwOGxp2TDR04jEuBvxjl5x33nxoaHHujsvdDGPQi/mwjfGpgUWvfpsdJQ==", "image1"=>"", "product"=>{"name"=>"aaaaaa", "info"=>"aaaaaaaaaaa", "status"=>"新品未使用", "delivery_fee_owner_id"=>"1", "price"=>"2000"}, "shipping_method"=>"1", "commit"=>"出品する"}

params.require(:product).permit(:shipping_method_id)

を見比べてみてください

見づらいので整形すると

{
  "utf8"=>"✓", 
  "authenticity_token"=>"省略", 
  "image1"=>"",
  "product"=>{
    "name"=>"aaaaaa",
    "info"=>"aaaaaaaaaaa",
    "status"=>"新品未使用",
    "delivery_fee_owner_id"=>"1",
    "price"=>"2000"
  },
  "shipping_method"=>"1",
  "commit"=>"出品する"
}

となります。

shipping_method_idproductの要素じゃない事がわかります。

よって、

  def shipping_method_params
    params.permit(:shipping_method_id)
  end

とする必要があります。

ただし、developmentおよびtest環境においては

Unpermitted parameters: :utf8, :authenticity_token, :image1, :product, :commit

ログが出ます。

無視するか、

  def shipping_method_params
    { shipping_method_id: params[:shipping_method_id]}
  end

とするかはお好みで

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.08%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Rubyに関する質問
  • [Rails5]ストロングパラメータでパラメーターを許可しているのにも関わらずUnpermitted parameters:が出てしまう。