発生した問題
form_withで入力フォームを作成し、値をDBに保存しようとしたが、ボタンをクリックしても画面遷移せず、またエラー画面も発生しない状況になり、何が起きているのかぱっと見わからない。
前提
表示させたいyoutubeの動画のurlをmovieモデルのmovie_urlカラムに保存したい。
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
<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
を削除し以下のように書き換えると画面遷移し、動画を表示することもできました。
private
def movie_params
params.permit(:movie_url, :user_id)
end
しかし、どっかの記事でrequireを消すのはあまり好ましくないと記載されていました。(なぜかわかる方は教えていただけると嬉しいです。)
よって再度コーディングし直すことに。
最終的な解決策
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
<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のオプションにモデルを指定しても値が渡らず、今回のエラーが発生したということでした。終わってみればとても簡単なことでしたがこれでかなりの時間を要してしまいました。
こちらの記事をちゃんと読むとしっかり記載されていました。
基本を抑えないとダメだなと思う経験でした。おしまい。