07/09/2018, 15:45

Permit params trong Rails

Hôm nay mình xin chia sẻ về cách permit params trong Rails. Khi gửi data cho backend với dạng Content-Type: application/json Trường hợp 1: cái này đơn giản: { phone: "+84935999999" email: "[email protected]" } Ở controller chúng ta sẽ permit: def info_params ...

Hôm nay mình xin chia sẻ về cách permit params trong Rails.
Khi gửi data cho backend với dạng Content-Type: application/json

Trường hợp 1: cái này đơn giản:

{
    phone: "+84935999999"
    email: "[email protected]"
}

Ở controller chúng ta sẽ permit:

def info_params
    params.permit(:phone, :email)
end

Trường hợp khác phức tạp hơn một tí, data của bạn là một array và nested khá nhiều:

{
    "flights": [
        {
            "location": {
                "from": {
                    "airport_name": "Danangairport",
                    "airport_code": "DAD",
                    "city_name": "Danang",
                    "country_name": "Vietnam"
                },
                "to": {
                    "airport_name": "Hochiminhcityairport",
                    "airport_code": "SGN",
                    "city_name": "Saigon",
                    "country_name": "Vietnam"
                }
            },
            "time": {
                "from": {
                    "date": "09-22-2015"
                },
                "to": {
                    "date": "09-25-2015"
                }
            }
        }
    ],
    "travelers": [
        1,
        2,
        3
    ],
    "flight_class": 0
}

Trong trường hợp này bạn muốn permit params: flights, travelers, flight_class theo cách có work không?

def info_params
    params.permit(:flights, :travelers, :flight_class)
end

Tất nhiên là không rồi!!! Vì hiện tại data của chúng ta nested khá nhiều. Vậy đâu là cách giải quyết cho việc permit params array nested thế này:

  def info_params
    params.permit({ :flights => [ :location => [ :from => [ :airport_name, :airport_code, :city_name, :country_name ],
                                                :to   => [ :airport_name, :airport_code, :city_name, :country_name ] ],
                                 :time     => [ :from => [:date],
                                                :to   => [:date] ]
                                ] },
                  { :travelers => [] },
                  :flight_class)
  end

Đơn giản phải không nào. Hi vọng là đã chia sẽ cho các bạn 1 tip mà các bạn có thể áp dụng được :) :v

0