Strong parameters

關於 Mass assignment 議題可以參考 ihower 寫的 Ruby on Rails 實戰聖經 - 網路安全的章節。

簡單來說就是如果直接傳入一個 params hash,會造成安全性的漏洞,所以必須做一些設定,Rails 使用 strong parameters 的機制來檢查 parmas 參數必須經過檢查才能做 mass assignment:

params.require(:user).permit(:name, :email, :password, :password_confirmation)

上述程式碼會傳回一個 params hash,而且只有經過檢查的屬性才會被包含在裡面,如果沒有指定 :user 會拋出錯誤。為了方便,可以定義一個 user_params 方法,換掉 params[:user]

@user = User.new(user_params)

user_params 方法只會在 Users controller 內部裡面使用,不需要開放給外部使用者,所以可以使用 Ruby private 關鍵字,,把這個方法設定成私有範圍:

app/controllers/users_controller.rb

class UsersController < ApplicationController
  .
  .
  .
  def create
    @user = User.new(user_params)
    if @user.save
      # Handle a successful save.
    else
      render 'new'
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end

user_params 做縮排會比較容易閱讀。

最後再測試一遍,填入無效的註冊資訊:

畫面正常了,不過還缺了給使用者看的錯誤提示。