Я использую 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
Я обнаружил, что если вы поместите файл 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
config.action_dispatch.perform_deep_munge = false
так как Rails 4.1