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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

390閲覧

Rails5でform_forの送信情報をコントローラで受け取れずエラーになる

appapp2

総合スコア9

Ruby

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

Ruby on Rails

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

1グッド

1クリップ

投稿2017/07/01 10:31

編集2017/07/02 11:35

###前提・実現したいこと
ユーザがフォームからPOSTしたデータをコントローラのインスタンス変数で受け取りたい。

Railsでアプリを作っています。
単純にフォームから送信したデータをコントローラで受け取りたいのですが、ParameterMissingが出て困っています。
フォーム入力データはしっかりとcreateアクションに到達しており、かつform_forの第一引数でモデルを指定しているのに
何故パラメータが空だと言われるのかが分かりません。

宜しくお願いします。

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

ActionController::ParameterMissing in DynamicPagesController#create param is missing or the value is empty: item Extracted source (around line #25): 23 24 def item_params 25 params.require(:item).permit(:name, :description, :money, 26 :method, :deadline, :comment) 27 end 28 end Request Parameters: {"utf8"=>"✓", "authenticity_token"=>"hogehoge", "name"=>"a", "description"=>"i", "money"=>"6", "method"=>"", "deadline"=>"1", "comment"=>"test"}

###該当のソースコード
app/views/dynamic_pages/new.html.erb

Ruby

1<%= form_for(@item, url: item_register_path, html: {class: 'form-horizontal'}) do |f| %> 2 3 <!-- name --> 4 <div class="col-sm-5"> 5 <input type="text" name="name" class="form-control" required aria-required="true"> 6 </div> 7 8 9 <!-- description --> 10 <div class="col-md-5"> 11 <input type="text" name="description" class="form-control"> 12 </div> 13 14 <!-- money --> 15 <div class="col-md-5"> 16 <input type="number" name="money" class="form-control" required aria-required="true"> 17 </div> 18 19 <!-- method --> 20 <div class="col-md-5"> 21 <select name="method" class="form-control"> 22 <option value="" selected>選択してください</option> 23 <option value="sample">sample</option> 24 </select> 25 </div> 26 27 <!-- deadline --> 28 <div class="col-md-5"> 29 <input type="number" name="deadline" class="form-control" min="0" max="31"> 30 </div> 31 32 <!-- comment --> 33 <div class="col-md-5"> 34 <textarea class="form-control" name="comment" rows="3"></textarea> 35 </div> 36 37 <!-- submit --> 38 <div class="col-md-offset-9"> 39 <button type="submit" class="btn btn-primary">登録</button> 40 </div> 41 42<% end %>

config/routes.rb

Ruby

1Rails.application.routes.draw do 2 3 get '/item-register', to: 'dynamic_pages#new' 4 post '/item-register', to: 'dynamic_pages#create' 5 resources :items 6 7end

DynamicPagesController

Ruby

1class DynamicPagesController < ApplicationController 2 3 def new 4 @item = Item.new 5 end 6 7 def create 8 @item = Item.new(item_params) 9 if @item.save 10 11 else 12 13 end 14 end 15 16 private 17 18 def item_params 19 params.require(:item).permit(:name, :description, :money, 20 :method, :deadline, :comment) 21 end 22end

###試したこと
@item = Item.new(item_params)を@item = paramsに書き換えるとうまくいきますが、
ストロングパラメータを使っていないのにエラーが出ないのも意味が分かりません。
セキュリティを考慮して、想定外のキーを受け取らない実装にしたいです。

###補足情報(言語/FW/ツール等のバージョンなど)
Ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
Rails 5.0.0.1

chocolate24👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

param is missing or the value is empty: item はパラメーターがないですよ、というエラーですね

問題はitemにオブジェクトが紐づいているのではなく、それぞれのデータが単体でできちゃってるっぽいですね
なんで以下のようなパラメーターを送信する必要があります

あとは、html側でform_forを使っていますが、こちらはerbテンプレートでrubyのコードを使えるようにするための物にも関わらず、わざわざ普通のhtmlを書くのは勿体無いと思うので、下記コードのように f.text_fieldを使えば問題なくエラーを解消できます

# このようなパラメーターにする。現状だと "item" にひもづいていないため、"item"に入っているべき :name, :moneyなどが missing と返ってきています {"item" => { "name"=>"a", "description"=>"i", "money"=>"6", "method"=>"", "deadline"=>"1", "comment"=>"test"}} # html 側 # form_forを使っているなら f.text_fieldを使ったほうがいいと思います <%= form_for(@item, url: item_register_path, html: {class: 'form-horizontal'}) do |f| %> <!-- name --> <div class="col-sm-5"> <%= f.text_field :name, class="form-control" required %> </div> <!-- 省略 --> <% end %>

投稿2017/07/02 13:36

hiyashikyuri

総合スコア388

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

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

appapp2

2017/07/02 14:16

ありがとうございました!無事解決しました。 送信されたパラメータがitemハッシュの中に入っていなかったことで、params.require(:item)で弾かれていたんですね。form_forに慣れておらず失礼しました。
hiyashikyuri

2017/07/02 14:20

いえいえ、解決できて何よりです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問