Search code examples
ruby-on-railsstrong-parameters

Rails strong parameters, user require and get an hash


I have this method

def create_billing_address(data)
    address_data = data.permit(:first_name,
                                :last_name,
                                :phone,
                                :address_1,
                                :city,
                                :postcode,
                                :country)
    service_customer.create_address(customer_id, address_data)
end

But now I want to check that all the keys are present. I tried to do this

address_data = data.require(:first_name,
                            :last_name,
                            :phone,
                            :address_1,
                            :city,
                            :postcode,
                            :country)

But require return an array instead of an hash.

How can I do to have the same behaviour of permit but with require ?


Solution

  • require is only intended to ensure that the params have the correct general structure.

    For example if you have:

    params.require(:foo).permit(:bar, :baz)
    

    require lets us bail early if the :foo key is missing since we cant do anything with the request.

    require is not intended to validate the presence of individual params - that is handled with model level validations in Rails.

    If you really had to you could do:

    def create_billing_address!(data)
      keys = [:first_name, :last_name, :phone, :address_1, :city, :postcode, :country]
    
     keys.each do |k|
        raise ActionController::ParameterMissing and return unless data[k].present?
     end
    
     service_customer.create_address(customer_id, data.permit(*keys))
    end
    

    But thats just bad application design as you're letting the model level business logic creep into the controller.