0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

form_withのcreateメソッドでparam is missing or the value is empty:が発生した件

Posted at

発生した問題

form_withで入力フォームを作成し、値をDBに保存しようとしたが、ボタンをクリックしても画面遷移せず、またエラー画面も発生しない状況になり、何が起きているのかぱっと見わからない。

前提

表示させたいyoutubeの動画のurlをmovieモデルのmovie_urlカラムに保存したい。

movies_controller.rb
class MoviesController < ApplicationController
  def new
    @user = current_user
  end

  def create
    @movie = Movie.create(movie_params)
    url = @movie.movie_url
    url = url.last(11)
    @movie.movie_url = url
    if @movie.save
      redirect_to show_home_path(current_user.id)
    else
      render 'new'
    end 
  end

  private
    def movie_params
      params.require(:movie).permit(:movie_url, :user_id)
    end
end
new.html.erb
<div class="profile-form">
  <div class="text-center">
    <h4>アピールしたい動画を貼ろう</h4>
  </div>
  <%= form_with url: create_movies_path do |f| %>
  <%= f.hidden_field :user_id, :value => @user.id %>
  <div class="profile-container">
    <table>
      <tr>
        <th><%= f.label :movie_url ,"自己PR動画(見てほしいyoutubeのurl)", class: "form-label" %></th>
        <td><%= f.text_field :movie_url, class: "mb-3 form-control" %></td>
      </tr>
    </table>
      <ul class="mb-3 form-check">
        <li><%= f.submit "作成", class: "btn btn-primary"%></li>
      </ul>
  </div>
  <% end %>
</div>

上記のコードで作成ボタンをクリックすると画面遷移せず、またエラー画面も表示されない状態になった。せめてエラー表示はしてくれ...
ということでログに何か手がかりがあるかもと思い、pumaのログを確認してみると

app_1  | ActionController::ParameterMissing (param is missing or the value is empty: movie
app_1  | Did you mean?  movie_url):

という一文を発見しました。ここでpravetemovie_paramsメソッドのrequireを削除し以下のように書き換えると画面遷移し、動画を表示することもできました。

movies_controller.rb
private
    def movie_params
      params.permit(:movie_url, :user_id)
    end

しかし、どっかの記事でrequireを消すのはあまり好ましくないと記載されていました。(なぜかわかる方は教えていただけると嬉しいです。)
よって再度コーディングし直すことに。

最終的な解決策

movies_controller.rb
class MoviesController < ApplicationController
  def new
    @user = current_user
    @movie = Movie.new #<== ここでmoveモデルのインスタンスを作成
  end

  def create
    @movie = Movie.create(movie_params)
    url = @movie.movie_url
    url = url.last(11)
    @movie.movie_url = url
    if @movie.save
      redirect_to show_home_path(current_user.id)
    else
      render 'new'
    end 
  end

  private
    def movie_params
      params.require(:movie).permit(:movie_url, :user_id)
    end
end

new.html.erb
<div class="profile-form">
  <div class="text-center">
    <h4>アピールしたい動画を貼ろう</h4>
  </div>
  <%= form_with model: @movie, url: create_movies_path do |f| %> #<=オプションにmovieモデルを追加
  <%= f.hidden_field :user_id, :value => @user.id %>
  <div class="profile-container">
    <table>
      <tr>
        <th><%= f.label :movie_url ,"自己PR動画(見てほしいyoutubeのurl)", class: "form-label" %></th>
        <td><%= f.text_field :movie_url, class: "mb-3 form-control" %></td>
      </tr>
    </table>
      <ul class="mb-3 form-check">
        <li><%= f.submit "作成", class: "btn btn-primary"%></li>
      </ul>
  </div>
  <% end %>
</div>

結論newメソッドにモデルのインスタンスを指定していなかったのでform_withのオプションにモデルを指定しても値が渡らず、今回のエラーが発生したということでした。終わってみればとても簡単なことでしたがこれでかなりの時間を要してしまいました。
こちらの記事をちゃんと読むとしっかり記載されていました。

基本を抑えないとダメだなと思う経験でした。おしまい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?