Rails で ToDo アプリをつくる⑥ (Rails 入門)

↓の続き

utouto97.hatenablog.com

Rails ストロングパラメータ

Rails には、ストロングパラメータというものがあります。
ストロングパラメータとは、安全性が検証されたパラメータということになります。
つまり、パラメータに不正な値がないかをチェックする必要があります。
そして、不正な値は無視します。

不正な値をチェックし、無視できるようにする理由は、マスアサインメント脆弱性による、意図しないデータの追加や編集が行われる可能性があるから、です。

参考: qiita.com

ストロングパラメータを利用し、不正なパラメータを利用できないようにする必要があります。

require と permit

Rails でストロングパラメータを利用する方法は二つあります。
一つ目がrequireメソッド、もう一つがpermitメソッドです。

requireは、一つのキーを指定し、そのキーに対応する値のみを返します。
permitは、複数のキーを指定し、そのキーそれぞれに対応するキーと値のペアを返します。

多くのケースでは、requireで絞り込みを行ったあとで、permitにより選択をする、といった使われ方が多いようです。

ToDoアプリのソースコード変更

ToDoアプリでも、Railsのストロングパラメータを利用できるように、変更していきます。
パラメータを受け取るのはコントローラーなので、app/controllers/todos_controller.rbを変更していきます。

変更点は以下の通りです。

@@ -4,14 +4,7 @@ class TodosController < ApplicationController
   end
 
   def create
-    @title = params[:title]
-    @description = params[:description]
-
-    @todo = Todo.new(
-      title: @title,
-      description: @description,
-      status: 'In progress'
-    )
+    @todo = Todo.new(todo_params)
 
     if @todo.save
       redirect_to :action => 'index'
@@ -22,17 +15,20 @@ class TodosController < ApplicationController
   end
 
   def destroy
-    @id = params[:id]
-    @todo = Todo.find(@id)
+    @todo = Todo.find(params.require(:id))
     @todo.destroy
     redirect_to :action => 'index'
   end
 
   def toggle
-    @id = params[:id]
-    @todo = Todo.find(@id)
+    @todo = Todo.find(params.require(:id))
     new_status = @todo.status == 'In progress' ? 'Complete' : 'In progress'
     @todo.update(status: new_status)
     redirect_to :action => 'index'
   end
+
+  private
+  def todo_params
+    return params.permit(:title, :description, :status)
+  end
 end

終わり