🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Q&A

解決済

1回答

2747閲覧

param is missing or the value is empty のエラー

majikadezou

総合スコア34

Ruby

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

0グッド

0クリップ

投稿2019/12/16 11:04

編集2019/12/17 06:37

snsアプリの投稿フォームを作っています。
投稿フォームに情報を入力して投稿しようとするとエラーが出てしまいます。

_micropost_form.html.erb フォームのパーシャル div class="container micropost-container"> <h1>Form</h1> <%= form_with(model: @micropost, url: microposts_path, local: true) do |form| %> <%= render 'shared/error_messages', object: form.object %> <div class="form-group"> <%= form.text_area :memo, class: 'form-control', placeholder: "メモを加えてください" %> </div> <div class="form-group"> <%= form.file_field :picture %> </div> <div class="form-group"> <%= form.submit "記録する", class: 'btn btn-info btn-lg form-submit' %> </div> <% end %> </div>
microposts/edit.html.erb <% provide(:title, 'メモ編集') %> <div class="container micropost-edit-container"> <div class="edit-titles"> <%= image_tag 'pencil.png', class: 'edit-img' %> <h1 class="title edit-micropost-title">メモ編集</h1> </div> <%= form_with(model: @micropost, url: micropost_path, local: true) do |form| %> <%= render 'shared/error_messages', object: form.object %> <div class="form-group"> <%= form.label :memo, 'メモ' %> <%= form.text_area :memo, class: 'form-control', placeholder: @micropost.memo %> </div> <div class="form-group"> <%= form.label :picture, '画像' %> <%= form.file_field :picture, class: 'form-control-file', placeholder: @micropost.picture %> </div> <div class="row"> <div class="col"> <div class="form-group"> <%= link_to "削除", micropost_path, method: :delete, data: { confirm: "本当に削除しますか?" }, class: 'btn btn-lg btn-danger btn-edit-user' %> </div> </div> <div class="col"> <div class="form-group"> <%= form.submit "編集", class: 'btn btn-info btn-lg btn-edit-user' %> </div> </div> </div> <div class="form-group"> <%= link_to "戻る", current_user, class: 'btn btn-lg btn-edit-user btn-back' %> </div> <% end %> </div>
microposts_controller.rb class MicropostsController < ApplicationController before_action :logged_in_user, only: [:create, :edit, :update, :destroy] before_action :correct_user, only: :destroy def create @user = current_user @micropost = current_user.microposts.build(micropost_params) if logged_in? @microposts = @user.microposts.page(params[:page]).per(10) if @micropost.save redirect_to current_user else render 'users/show' end end 中略 private def micropost_params params.require(:micropost).permit(:memo, :picture) end end

micropost_paramsでparams を許可しているのですが、

エラー文 ActionController::ParameterMissing in MicropostsController#create param is missing or the value is empty: micropost app/controllers/microposts_controller.rb:44:in `micropost_params' app/controllers/microposts_controller.rb:7:in `create'

となって読み取れていないようです。どなたか原因が分かる方はいらっしゃいませんか?

create時のログ Started POST "/microposts" for ::1 at 2019-12-16 21:43:29 +0900 Processing by MicropostsController#create as HTML Parameters: {"authenticity_token"=>"V0UoBbmVx9oKmvkJ4C1I2cDb4oxAPI0XIt/1Byuf18/jv/5xUHo09B33/dmsTJFDGGsfMQBoSAchMpXlep4/lw==", "memo"=>"ああああああ", "commit"=>"記録する"} User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/helpers/sessions_helper.rb:16:in `current_user' Completed 400 Bad Request in 2ms (ActiveRecord: 0.2ms | Allocations: 1202) ActionController::ParameterMissing (param is missing or the value is empty: micropost): app/controllers/microposts_controller.rb:45:in `micropost_params' app/controllers/microposts_controller.rb:7:in `create' Started GET "/microposts/148/edit" for ::1 at 2019-12-16 21:47:04 +0900 Processing by MicropostsController#edit as HTML Parameters: {"id"=>"148"} User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/helpers/sessions_helper.rb:16:in `current_user' Micropost Load (0.3ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? AND "microposts"."id" = ? ORDER BY "microposts"."created_at" DESC LIMIT ? [["user_id", 1], ["id", 148], ["LIMIT", 1]] ↳ app/controllers/microposts_controller.rb:18:in `edit' Rendering microposts/edit.html.erb within layouts/application Rendered shared/_error_messages.html.erb (Duration: 0.3ms | Allocations: 75) Rendered microposts/edit.html.erb within layouts/application (Duration: 7.6ms | Allocations: 2045) [Webpacker] Everything's up-to-date. Nothing to do Rendered layouts/_header.html.erb (Duration: 3.0ms | Allocations: 1392) Rendered layouts/_footer.html.erb (Duration: 0.7ms | Allocations: 134) Completed 200 OK in 47ms (Views: 40.0ms | ActiveRecord: 0.5ms | Allocations: 14740) コード

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

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

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

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

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

guest

回答1

0

ベストアンサー

このエラーは params[:micropost]が無いか、有ってもデータの入っている要素がない 場合に起きます。
viewを見ると入力は memo と picture がありますが、これらに何か入れてから「記録する」しましたか?

なお、file uploadですから form にmultipart: true がないと、file名しか送られません。

投稿2019/12/16 12:03

winterboum

総合スコア23567

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

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

majikadezou

2019/12/16 12:53

回答ありがとうございます。 <%= form_with(model: @micropost, url: microposts_path, local: true, multipart: true) do |form| %> に変更しましたが変化がありません。。。 しかし、なぜか投稿の編集のformは機能していて、投稿内容の変更に成功します。(そのコードを当記事に追加させていただきました) ただ、こちらも、画像の投稿には失敗します。その際のエラーは YAML syntax error occurred while parsing app/config/storage.yml. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Error: (<unknown>): did not find expected key while parsing a block mapping at line 1 column 1 とちんぷんかんぷんです。。。
winterboum

2019/12/17 00:11

YAMLに関しては、多分インデントがずれているんでしょう。タブもつかってはいけません。 タブ、全角空白がないことを確認し、インデントを揃えて試してみてください。
winterboum

2019/12/17 00:14

createに失敗するときのlogも載せていただけますか
majikadezou

2019/12/17 06:43

おっしゃる通り、YAMLはインデントがずれていました。ありがとうございます。 ただ、次は Cannot load `Rails.config.active_storage.service`: missing credentials, provide credentials with one of the following options: - :access_key_id and :secret_access_key - :credentials - :credentials_provider def resize_picture return self.picture.variant(resize: '100x100').processed end と出てしまいました。アクセスキーとシークレットアクセスキーは渡しているのですが なぜか紐付いていないようです。ちなみにリサイズにはMinimagicを使用しています。
winterboum

2019/12/17 06:46

ParameterMissing は解決したのでしょうか?
majikadezou

2019/12/17 06:58

失礼しました。解決できていません・・・ 投稿ページ自体ひらけなくなってしまったのでデータベースの問題かと勝手に思ってしまいました。 create時のログを見ても、badrequestとなっていてリクエストに失敗しているのかもしれませんが、分かりません。ちなみにlogというのはコンソールのログで合っていますか?
winterboum

2019/12/17 07:08

んと、 ParameterMissing が発生するのは 投稿ページを開いて、そこからの処理ですか? だと確かにそちらを先に解決しないとなりませんが、今まで開いていたのですよね? 何をしました?multipart: trueを入れただけ? 他にもなにかしました?
majikadezou

2019/12/17 08:08

ParameterMissing が発生するのは投稿ページを開いて、そのページにあるフォームで情報を入力してからcreateアクションを行う際のエラーです。 画像のリサイズに失敗しているせいで一時的に投稿ページをひらけなくなってしまっておりました。今はリサイズの機能を一時的に取り除くことで開ける状態に戻しました。失礼いたしました。おそらくMinimag をダウンロードしたことで、ひらけなくなってしまったのかと。。。(画像データ自体は投稿に成功しているようでした) 話がそれてしまいましたが、やはりParameterMissingが起きてしまっています。 エラー文を見ると、 microposts_controllerm のcreateアクション部分にも問題があるようなので、その書き方が間違えているのかもしれません。。。
winterboum

2019/12/17 08:10

log見せてください
majikadezou

2019/12/17 08:27

ターミナルのlogなのですが、これで合っていますか? Started POST "/microposts" for ::1 at 2019-12-17 17:24:33 +0900 Processing by MicropostsController#create as HTML Parameters: {"authenticity_token"=>"jQmiGE9Q4wzpZlmTWidRMkPpzkAhvV2b0qM62WlOtaZfhDJO/UznF9o6zbtcmfezidHtFPqhhTWgH3T5nLFaCQ==", "memo"=>"あいうえお", "commit"=>"記録する"} User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/helpers/sessions_helper.rb:16:in `current_user' Completed 400 Bad Request in 2ms (ActiveRecord: 0.1ms | Allocations: 1222) ActionController::ParameterMissing (param is missing or the value is empty: micropost): app/controllers/microposts_controller.rb:45:in `micropost_params' app/controllers/microposts_controller.rb:7:in `create'
winterboum

2019/12/17 08:46

はて、 Paramaters が "micropost" => {"memo"=>"あいうえお", "commit"=>"記録する"} になっていないですね。あのformならそうなると思うのだが。。。 そのため、paramsがないとなってます。 よもや @micorpost は = Micropost.new していないとか言うことはないですか?
majikadezou

2019/12/17 09:14

あっ。。。 していません。 @micropost = current_user.microposts.build(micropost_params) この書き方ではダメなのですか?
winterboum

2019/12/17 12:01

1) _micropost_form を呼び出すaction  ↓ 2) _micropost_form  ↓ 3) _micropost_formからのリクエストを受けるaction と流れますが、その buildは3)ですね? 1) で @micropost=Micripost.newしておかないと、@micropostがnilのままなので、まずいです
majikadezou

2019/12/17 12:34

なるほど! Micropost.newは必要なのですね。 formはusers/showページに置いてあるので、 users_controller の show アクション内で、@micropost = Micropost.new をするということでしょうか?
winterboum

2019/12/17 12:40

show アクションから呼んでいるなら、そうです
winterboum

2019/12/17 12:42

<%= form_with(model: @micropost, のところで <%= form_with(model: Micropost.new, する、という手もあります
majikadezou

2019/12/17 14:21

ありがとうございます! 投稿できました! <%= form_with(model: Micropost.new, でもできるんですね、奥が深い。。。 多大なご協力感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問