Rails基礎 ストロングパラメータとバリデーション
今回はユーザーの入力値チェックを行う機能について書いていく。
ストロングパラメータとは?
WEB上でユーザーが送信してきたパラメータの内容をチェックしてから受け取る仕組みのこと。
悪意のあるデータを事前に防ぐことができる。
事前に受け付ける項目を指定しておくことで、裏で持っているユーザーからの入力を受け付けていない項目に値が入っていたら弾いてくれる。
フォームから送られてくるパラメータが対象で、create
やupdate
などの機能に実装する。
書き方例
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つ表示してくれる。 (必須チェック→文字数チェック、のように、順番も意識したほうが良さそう)