SuzuBlog

webのお勉強はじめたばかりの初心者。備忘録

Rails基礎 ストロングパラメータとバリデーション

今回はユーザーの入力値チェックを行う機能について書いていく。

ストロングパラメータとは?

WEB上でユーザーが送信してきたパラメータの内容をチェックしてから受け取る仕組みのこと。

悪意のあるデータを事前に防ぐことができる。

事前に受け付ける項目を指定しておくことで、裏で持っているユーザーからの入力を受け付けていない項目に値が入っていたら弾いてくれる。

フォームから送られてくるパラメータが対象で、createupdateなどの機能に実装する。

書き方例

postモデルのcreateに機能を実装したい場合 controllerに記述していく。

    def create
         @post = Post.new(params.require(:post).permit(:title,:body))
    end

まず、requireメソッドで対象とするモデル、キーを指定することで、それに紐付いている値だけを抽出することが可能になる。

そしてpermitメソッドで許可する値を明示的に指定してあげることで、他の項目が悪意ある改ざんを受けたとしてもスルーしてくれるようになる。

(この場合、titleとbody以外にカラムがあったとしてもそのカラムの登録・変更は受け付けない)

メソッドに切り出す

上記ではcreateメソッドに直接書きましたが、繰り返されることが多い処理なので(登録と編集とか) privateメソッドに切り出すのが慣習のよう。

    def create
         @post = Post.new(post_params)
    @post.save
    end

    private
        def post_params
            params.require(:post).permit(:title,:body)
        end

メソッド名はモデル名_paramsとしてあげるのが一般的らしい。

バリデーションとは?

先程のストロングパラメータとは違い、バリデーションは入力された値そのものに対してチェックを行っていく

例えば、入力必須の項目であったり、最低文字数が決まっている、メールアドレスだと@が入っているかどうか、等。

バリデーションはapp/models/post.rbに記入していく。

class Post < ApplicationRecord
    validates :title, presence: true, length: {minimum: 3, message: 'Too short to post!'}
    validates :body, presence: true
end

タイトルの行は「タイトルに対してのバリデーションで、必須項目だよ、最低文字数は3文字で、条件が満たない場合は「Too short to post!」とエラーメッセージを返してね」という意味になる。

バリデーションが成功したかどうかは.saveの返り値でbool型で返却されるので、controllerで結果を受け取って処理を行う。

    def create
        @post = Post.new(post_params)
        if @post.save
            redirect_to posts_path
        else
            render 'new'
        end
    end

これで、成功すればposts_pathにリダイレクトし、そうじゃない場合はnewと同じviewを表示してくれる。

あとはviewでエラーメッセージを表示するようにすれば良い。

<% if @post.errors,messages[:title].any? %>

でエラーメッセージがあるかどうかを調べ、エラーが有る場合(=true)は、

<%= @post.errors.messages[:title][0] %>

としてあげれば、複数のエラーがあった場合も、最初のエラーが消えるまで最初の1つ表示してくれる。 (必須チェック→文字数チェック、のように、順番も意識したほうが良さそう)