18
2

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.

文字を入力しているのにvalidationが反応してしまう時

Last updated at Posted at 2022-07-26

概要

記事を書くきっかけ(model)
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が正常に入っているかターミナルで確認しました。

スクリーンショット 2022-07-26 21.54.45.png

上記の画像の通り、parametersのところにcontentが正常に入っているため
今回のケースは2つ目のケースだと考えcontrollerファイルを確認しました。

post_app/app/controllers/posts_controller.rb
#省略
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という引数を渡して
それをサーバー側に送ります。

補足

storng parameter
def post_params
  params.require(:post).permit(:content)
end

上記のpost_paramsというメソッドですが
いきなり出てきて何だこれと思われたと思います。
このメソッドはstorng parameterというもので
指定されたパラメータだけ取得するというものです。

上記のコードを例にして言いますと
postテーブルのcontentカラムのパラメータだけを
取得するという意味になります。
strong parameterを使うことで
想定していないパラメータの取得を防ぐことができ
よりセキュリティ性のある
アプリケーションを作ることができます。

最後に

無駄に長くなり、読みにくい文章になりましたが
最後まで読んでいただきありがとうございました!
もし皆さんの役に立ったのなら光栄です!

18
2
1

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
18
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?