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

# 発生した問題
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):
```

という一文を発見しました。ここで`pravete`の`movie_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のオプションにモデルを指定しても値が渡らず、今回のエラーが発生したということでした。終わってみればとても簡単なことでしたがこれでかなりの時間を要してしまいました。
こちらの記事をちゃんと読むとしっかり記載されていました。

https://pikawaka.com/rails/form_with

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