12/08/2018, 13:50

Strong Parameters

Strong Parameters Action Controller parameters bị cấm sử dụng với tính năng Mass Assignment (cho phép update 1 model) trong Active Model, vì vậy chúng ta phải quyết định những attributes nào được phép mass update. Parameters được mark là cần thiết. Khi tất cả các params yêu cầu được không được ...

Strong Parameters

Action Controller parameters bị cấm sử dụng với tính năng Mass Assignment (cho phép update 1 model) trong Active Model, vì vậy chúng ta phải quyết định những attributes nào được phép mass update. Parameters được mark là cần thiết. Khi tất cả các params yêu cầu được không được thỏa mãn thì kết quả sẽ trả về là 400 Bad Request.

# không sử dụng mass assignment
user = User.find(1)
user.name = "Your name"
user.email = "youremail@email.com"
user.save
# Sử dụng mass assignment
user = User.find(1)
user.update( name = "Your name", email = "youremail@email.com")

Strong parameters ngăn chặn việc ta không kiểm soát được những giá trị trong params.

class PeopleController < ActionController::Base
def create
  User.create(params[:person])
end
def update
  user = User.find(params[:id])
  user.update!(user_params)
end

private
def person_params
  params.require(:user).permit(:name, :email)
end
end

Cách sử dụng

require(:user) bắt buộc trong params phải có key là user

permit(:name, :email) trong key user chỉ cho phép name và email

Nested Parameters

params.permit(:name, { emails: [] },
              friends: [ :name,
                         { family: [ :name ], hobbies: [] }])

định nghĩa các params được phép thay đổi gồm name, emails, và friends attributes, trong đó emails là một mảng các giá trị vô hướng tương tự với hobbies.

Ví dụ khác

Khi bạn muốn sử dụng các attributes mà chúng chưa được sinh ra khi gọi mới:

params.fetch(:blog, {}).permit(:title, :author)
#nếu params[:blog] có thể sử dụng :title và :author, nếu không thì trả về {}

Bên ngoài phạm vi của Params

Các API Strong params được thiết kế chủ yếu trong các trường hợp thông thường. Không có nghĩa là nó có thể xử lý hết các params mà bạn cần sử dụng. Tuy nhiên có thể dễ dàng kết hợp API cho trường hợp này.

def product_params
  params.require(:product).permit(:name,
     data: params[:product][:data].try(:keys))
end

Mong bài viết này có ích cho bạn! Thân.

0