[英]How can I implement strong parameters in rails 4?
class User < ActiveRecord::Base
validates :password, presence: true, length: { minimum: 6 }
validates :password_confirmation, presence: true
has_secure_password
validates(:name, presence: true, length: {maximum: 50})
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates(:email, presence: true,format: { with: VALID_EMAIL_REGEX }, uniqueness: true)
end
class UsersController < ApplicationController
def new
end
private
def user_params
params.require(:user).permit(:name)
end
end
所以我應該只能批量更新(mass-assign)name屬性。
但是當我登錄到Rails控制台並鍵入以下命令時
user=User.find(1)
user.update_attributes(name: "ck",email: "ck@gmail.com", password: "ckck9090", password_confirmation: "ckck9090")
user.save
我仍然可以更新電子郵件。
我沒有在.permit()參數中提到:email屬性。 那么,如何仍然可以批量更新email屬性?
我想念什么嗎?
答案的關鍵在這里:
def user_params
params.require(:user).permit(:name)
end
您正在通過Rails控制台進行測試,而不使用params
哈希。 除非另有說明,否則Rails不知道您的參數來自何處,並且會使用它們。
如果您確實想看到自己強大的參數在起作用,我建議您這樣做:
create
一個create
方法,並驗證您是否具有觸發它的正確路線 像這樣:
@user = User.new user_params
@user.save
Gemfile
,這樣,您可以通過在代碼中的任何位置添加byebug
或debugger
來停止執行。 所以總的來說,這看起來像 像這樣:
class UsersController < ApplicationController
def new
end
def create
@user = User.new user_params
byebug
@user.save
end
private
def user_params
params.require(:user).permit(:name)
end
end
這不是很慣用,但應該可以說明。 從那里,您可以在REPL中輸入@user
來查看其中的內容。 您應該能夠看到正在發生的過濾。
據我所知,strong_parameters並不完全禁止使用質量分配,而只是禁止在質量分配中使用params
作為參數。 因此,您仍然可以手動執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.