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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

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

Q&A

解決済

2回答

6257閲覧

[Rails]謎の空の値&Unpermitted parameter

yclin_tagaya

総合スコア27

Ruby on Rails

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

0グッド

1クリップ

投稿2016/03/17 02:54

多対多の関係を作りたいですが、
createとupdateの時うまくいかないため、
質問をさせていただきました。

[app/controllers/admin/stylists_controller.rb]

lang

1 def new 2 @stylist = Stylist.new 3 end 4 5 def create 6 @stylist = Stylist.new(stylist_params) 7 if @stylist.save 8 redirect_to admin_stylists_path 9 else 10 render 'new' 11 end 12 end 13 14 private 15 def stylist_params 16 params[:stylist].permit(:name, :furigana, :email, :tel, :area_ids => []) 17 end

[app/views/admin/stylists/new.html.erb]

lang

1<div class="col-md-4 col-md-offset-4"> 2 <%= simple_form_for [:admin, @stylist] do |f| %> 3 <div class="form-group"> 4 <%= f.input :name, label: '名前', input_html: { class: "form-control"} %> 5 <%= f.input :furigana, label: 'ふりがな', input_html: { class: "form-control"} %> 6 <%= f.input :email, label: 'メールアドレス', input_html: { class: "form-control"} %> 7 <%= f.input :tel, label: '電話番号', input_html: { class: "form-control"} %> 8 <%= f.input :areas, label: 'エリア', collection: Area.all, as: :check_boxes, input_html: { class: "checkbox" } %> 9 </div> 10 <div class="form-actions"> 11 <%= f.button :submit, '確定', disable_with: "Submiting...", class: "btn btn-primary" %> 12 </div> 13 <% end %> 14</div>

[app/models/stylist.rb]

lang

1class Stylist < ActiveRecord::Base 2 has_many :stylist_areas 3 has_many :areas, :through => :stylist_areas 4end

[app/models/area.rb]

lang

1class Area < ActiveRecord::Base 2 has_many :stylist_areas 3 has_many :stylists, through: :stylist_areas 4end

[app/models/stylist_area.rb]

lang

1class StylistArea < ActiveRecord::Base 2 belongs_to :stylist 3 belongs_to :area 4end

[db/seeds.rb]

lang

1["京都", "大阪", "神戸"].each do |area| 2 Area.find_or_create_by!(name: area) 3end

以上の設定でやってみたら、

lang

1 Parameters: {"utf8"=>"✓", "authenticity_token"=>"Oz2LCnpAvN9VbpE2N1Cce7se0Klxrl6d0hVBGc9lsO+i4mm0VzJ6mBQx2kQXdtiDlBCB6PsuymTZ/ysoiKWePA==", "stylist"=>{"name"=>"ヘアメイク1", "furigana"=>"へあめいく1", "email"=>"111@mail.com", "tel"=>"00-0001-0001", "areas"=>["1", "2", ""]}, "commit"=>"確定", "id"=>"2"} 2 Admin Load (0.1ms) SELECT "admins".* FROM "admins" WHERE "admins"."id" = ? ORDER BY "admins"."id" ASC LIMIT 1 [["id", 1]] 3 Stylist Load (0.1ms) SELECT "stylists".* FROM "stylists" WHERE "stylists"."id" = ? LIMIT 1 [["id", 2]] 4Unpermitted parameter: areas 5 (0.0ms) begin transaction 6 (0.0ms) commit transaction 7Redirected to http://127.0.0.1:3000/admin/stylists 8Completed 302 Found in 3ms (ActiveRecord: 0.2ms)

まずParameters{...}に
areas"=>["1", "2", ""]
謎の空の値が出てきました・・・

また
Unpermitted parameter: areas
と許可されていないparametersだと怒られました。

いろいろぐぐってみたら、strong parametersのとこで
:area_ids => []
と書けば直るとのことですが・・・

ご回答頂ければと思います!
どうぞよろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

チェックされない時に何も送られない、という事態を避けるために、Rails側が自動で空の値のhiddenを追加しています。

止めるには、

erb

1<%= f.input :areas, label: 'エリア', collection: Area.all, as: :check_boxes, input_html: { class: "checkbox" }, include_hidden: false %>

のように、include_hidden: falseを追加してください(Simple formのIssue)。

投稿2016/03/17 03:03

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yclin_tagaya

2016/03/17 03:06

ありがとうございます!!! <%= f.association :areas, label: 'エリア', as: :check_boxes, input_html: { class: "checkbox" }, include_hidden: false %> に変更したら無事に解決できました!! 本当にありがとうございました!!またよろしくお願いします!!!
guest

0

[app/views/admin/stylists/new.html.erb]

lang

1<div class="col-md-4 col-md-offset-4"> 2 <%= simple_form_for [:admin, @stylist] do |f| %> 3 <div class="form-group"> 4 <%= f.input :name, label: '名前', input_html: { class: "form-control"} %> 5 <%= f.input :furigana, label: 'ふりがな', input_html: { class: "form-control"} %> 6 <%= f.input :email, label: 'メールアドレス', input_html: { class: "form-control"} %> 7 <%= f.input :tel, label: '電話番号', input_html: { class: "form-control"} %> 8 <%= f.association :areas, label: 'エリア', as: :check_boxes, input_html: { class: "checkbox" } %> 9 </div> 10 <div class="form-actions"> 11 <%= f.button :submit, '確定', disable_with: "Submiting...", class: "btn btn-primary" %> 12 </div> 13 <% end %> 14</div>

<%= f.input :areas, label: 'エリア', collection: Area.all, as: :check_boxes, input_html: { class: "checkbox" } %>
↓↓↓↓↓↓↓
<%= f.association :areas, label: 'エリア', as: :check_boxes, input_html: { class: "checkbox" } %>

に変更したら解決できました・・・

投稿2016/03/17 03:03

編集2016/03/17 03:07
yclin_tagaya

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問