AngularJS отправка пустого массива превращается в ноль

0

Я использую AngularJS 1.5 с Rails 3.2 на бэкэнд, и когда я отправляю пустой массив к моменту, когда он попадает в мой метод создания Rails, что-то превратило его из пустого массива в значение nil.

  $scope.create = ->
    Invoice.save(
      {}
    ,
      invoice: InvoiceService.construct_json($scope)
    , (response) ->
      $location.path "/invoices"
    , (response) ->
      $scope.errors = response.data
      flash('alert', "Invoice has errors and cannot be saved", 2000)
    )

Как раз перед Invoice.save я вижу, что timheets_attributes имеет значение [].

construct_json: (scope) ->
  {
    # <snip irrelevant info>
    # Timesheets
    timesheets_attributes: _.map(scope.invoice.timesheets_attributes, (ts) ->
      _.omit(ts, 'job')
    )
  }

Если я поставлю byebug в моем методе создания контроллера счета, я обнаружил, что params [: invoice] [: timesheets_attributes] установлен на nil.

Если я добавлю расписание, то Angular правильно разместит массив. Есть ли способ, которым я могу остановить преобразование массива в нуль?

Моя текущая работа - применить before_filter, но этот хак перестает работать сейчас из-за введения cancancan. Load_and_authorize_resource cancancan происходит до любого из фильтров. Мне никогда не нравился этот хак и хотелось бы узнать, почему он превращает совершенный пустой пул в нуль.

  def json_fix
    params[:invoice][:timesheets_attributes] ||= []
  end
  • 0
    Action_dispatch от Rail отфильтрует пустые массивы до того, как cancancan получит параметры. Вы можете отключить эту функцию с помощью config.action_dispatch.perform_deep_munge = false так как Rails 4.1
Теги:
arrays
coffeescript

1 ответ

0

Я обнаружил, что если вы поместите файл before_filter с моим json_fix выше cancancan load_and_authorize_resource, то он будет работать.

before_filter :json_fix, only: [:update, :create]
before_filter :authenticate_staff!
load_and_authorize_resource  # Check cancancan

Ещё вопросы

Сообщество Overcoder
Наверх
Меню