Загрузка структуры данных на основе классов coffeescript в ruby ​​на рельсах 3 с помощью jquery? - PullRequest
3 голосов
/ 07 февраля 2012

У меня есть структура данных coffescript, которая состоит из объекта, у которого есть массивы других объектов, у этих объектов есть вспомогательные методы, которые облегчают манипулирование данными в структуре данных:

class CrossData

  species_list: {
    species1: [21,10,30,40]
  }

  constructor: () ->
    @species = "defualt"
    @donors = [new CrossDonor] #array that will be full of CrossDonors

  helper_method: (arg1) =>
    #do stuff with crossdata

class CrossDonor
  constructor: () ->
    @name = "default"
    @linkage_group = -1
    @trait_cm = -1

  helper_method: (arg1) ->
    #do stuff with cross donor 

cross_data = new CrossData

если я попытаюсь загрузить это через jquery ajax, то есть:

$.ajaxSetup(
  beforeSend: (xhr) ->
    xhr.setRequestHeader('X-CSRF-Token',
    $('meta[name="csrf-token"]').attr('content')))

$.ajax(
  type: "POST",
  url: '/crosses/save',
  data: cross_data
  contentType: 'json'
  success: (msg) -> 
    alert( "Data Saved: " + msg )
)

он не работает, так как он работает с функциями, я думаю, что ответ заключается в создании функции, которая производит json-версию классов сценариев кофе. Мне интересно, есть ли плагин jquery, который даст мне тип данных coffee_class?

1 Ответ

3 голосов
/ 07 февраля 2012

Единственное, что вы могли бы сделать в будущем, это добавить метод toJSON:

Если объект, подвергаемый строковому форматированию, имеет свойство с именем toJSON, значение которого является функцией, то метод toJSON настраивает поведение строковой JSON: вместо сериализуемого объекта будет возвращено значение, возвращаемое методом toJSON при вызове.

Это более или менее похоже на to_json в Rails.К сожалению, jQuery не будет вызывать его автоматически, но библиотека JSON будет и Backbone (если вы в конечном итоге используете Backbone);добавление метода toJSON также позволяет объекту управлять собственной сериализацией.

Затем добавьте вызов toJSON к вашему $.ajax:

$.ajax(
  type: "POST"
  url: '/crosses/save'
  data: cross_data.toJSON()
  contentType: 'json'
  success: (msg) -> 
    alert( "Data Saved: " + msg )
)

Или, с недавним JQuery,Вы можете настроить предварительный фильтр AJAX для автоматического вызова toJSON, когда он доступен:

$.ajaxPrefilter( (opts, original_opts) ->
    if(original_opts.data && original_opts.data.toJSON && $.isFunction(original_opts.data.toJSON)
        opts.data = $.param(original_opts.data.toJSON())
)

Тогда, если вы позвонили $.ajax с data, который имелtoJSON метод, toJSON будет вызван для сериализации объекта data.

Вы также можете настроить простой рекурсив $.ajaxPrefilter, чтобы автоматически пропустить что-либо в original_opts.data, $.isFunction обнаружено как функция.Вы можете использовать $.isPlainObject, чтобы пропустить data, которое уже является строкой.

Я не знаю ни одного плагина, который делает это автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...