Webアプリケーションを初めて作成していたときに困ったエラーでparamsから受け取ったデータを保存するときにparamsの値が存在しないとエラーが出て困ったので、初学者で同じように困る方もいるのではないかと思い、今回の記事を作成しました。
下記のような記述をしていてエラーが出ました。
posts_controller.rb
class PostsController < ApplicationController
def index
@posts = Post.all
end
def new
@post = Post.new
end
def create
binding.pry
Post.create(post_params)
end
private
def post_params
params.require(:post).permit(:text)
end
end
new.html.erb
<h1>新規投稿ページ</h1>
<%= form_with url: '/posts',method: :post, local: true do |form| %>
<%= form.text_field :text %>
<%= form.submit '投稿する' %>
<% end %>
投稿画面でテキストを投稿すると
param is missing or the value is empty: post
とエラーが発生
問題点
コントローラーで定義した下記のインスタンス変数
posts_controller.rb
def new
@post = Post.new
end
これがnew.html.erbで受け取れていない
new.html.erb
<%= form_with url: '/posts',method: :post, local: true do |form| %>
<%= form.text_field :text %>
<%= form.submit '投稿する' %>
<% end %>
@postを受け取っていないので送信されたparamsの中にpostモデルのインスタンス変数がない
解決策
new.html.erb 改善前
<%= form_with url: '/posts',method: :post, local: true do |form| %>
new.html.erb 改善後
<%= form_with(model: @post, local: true) do |form| %>
model: @post部分でcontrollerのnewアクションで定義したインスタンス変数を受け取り、送信時に@postのモデルインスタンスと紐づけて送信することで
require(:post)に値が入っている状態となる
自分なりに調べたことへの解釈ですが、自分はこれでうまくいきました。