概要
validates :content, presence: true, length: { in: 1..140 }
というvalidationを書いた後、
なぜか文字を入力しているのにvalidationが反応したため
解決に至るまでの経緯を記そうと思います!
経緯
プログラミングスクールのツイートアプリケーション作成課題に取り組んでいる際、
以下のバリテーションを実装しました。
・投稿内容に対して1 ~ 140字以内の文字数であること
ところが、上記のバリテーションを実装し開発環境のViewで確認したところ
実装したvalidationを満たす内容でもvalidationが反応して
エラーメッセージが出てしまうという部分で詰まったため本記事を書くに至ります。
原因
controllerのcreateアクションの記述が足りなかったことです。
※viewのformでsubmitしたパラメータをコントローラーで受け取っていなかった
解決に至る経緯
上述したvalidationが反応してしまうケースは2つあると考えました。
1.ブラウザ側がサーバー側にリクエストを正常に送れなかったケースです。
2.はブラウザ側はリクエストを正常に送ったがサーバー側で受け取れなかったか誤った処理をしてブラウザ側に送っている
まずはparametersにcontentがしっかり入っているかを確認するため、
パラメータのところにcontentが正常に入っているかターミナルで確認しました。
上記の画像の通り、parametersのところにcontentが正常に入っているため
今回のケースは2つ目のケースだと考えcontrollerファイルを確認しました。
#省略
def create
@post = Post.new
if @post.save
redirect_to posts_path, notice: "ポストを作成しました!"
else
render :new
end
end
#省略
上記のコードが確認した際のコードです。
@post = Post.new
Post.newの部分が問題を引き起こしているところで、
newメソッドはインスタンスを生成しているだけなので
この状態でviewのフォームを埋めてsubmitしても中身がないので
サーバー側は中身がないと判断します。
なのでPost.newのところに引数を定義して投稿できるようにしていきます。
#
def create
@post = Post.new(post_params)
if @post.save
redirect_to posts_path, notice: "ポストを作成しました!"
else
render :new
end
end
def post_params
params.require(:post).permit(:content)
end
@post = Post.new(post_params)
Post.new(post_params)と定義することで
newメソッドにpost_paramsという引数を渡して
それをサーバー側に送ります。
補足
def post_params
params.require(:post).permit(:content)
end
上記のpost_paramsというメソッドですが
いきなり出てきて何だこれと思われたと思います。
このメソッドはstorng parameterというもので
指定されたパラメータだけ取得するというものです。
上記のコードを例にして言いますと
postテーブルのcontentカラムのパラメータだけを
取得するという意味になります。
strong parameterを使うことで
想定していないパラメータの取得を防ぐことができ
よりセキュリティ性のある
アプリケーションを作ることができます。
最後に
無駄に長くなり、読みにくい文章になりましたが
最後まで読んでいただきありがとうございました!
もし皆さんの役に立ったのなら光栄です!