Я использую гем backbone-on-rails и получил следующее:
Модель
class Crayons.Models.Color extends Backbone.Model
validate: (attrs) ->
if attrs.colorname.length == 0
return "colorname can't be empty"
Коллекция
class Crayons.Collections.Color extends Backbone.Collection
url: '/api/colors'
коллекция создается в роутере
initialize: ->
@collection = new Crayons.Collections.Color()
@collection.fetch()
Методы в ColorIndex
createCrayonId: (event) ->
event.preventDefault()
val = new Crayons.Models.Color()
val.on("error", @errorHandling);
val.set(colorname: $('#new_color_name').val())
@collection.create colorid: val.get("colorname");
$('#new_color')[0].reset()
errorHandling: (model, event) ->
alert(event)
У меня есть простая проверка, которая показывает предупреждение, когда длина равна нулю. Однако после окна предупреждения элементы все еще добавляются в коллекцию из-за @collection.create colorid: val.get("colorname");
Что я могу сделать, чтобы предотвратить добавление в коллекцию результатов при обнаружении ошибки?
Update1
Краткосрочное решение приведено ниже, и оно работает, но я не уверен, правильно ли это делать
ok = val.set(colorname: $('#new_video_url').val())
if ok
@collection.create colorname: val.get("colorname");
Update2
class Crayons.Collections.Colors extends Backbone.Collection
url: '/api/videos'
model: new Crayons.Models.Color()
validate: (attrs) ->
if attrs.colorname.length == 0
return "colorname can't be empty"
Правильный путь
Функция проверки должна присутствовать в модели, а функция, которая предупреждает об ошибке, должна быть инициализирована в модели.
class Crayons.Models.Color extends Backbone.Model
initialize: ->
this.bind("error", @errorHandling)
errorHandling: (model, event) ->
alert(event)
validate: (attrs) ->
#your error validation goes here
Теперь метод в индексе довольно прост
createCrayonId: (event) ->
event.preventDefault()
@collection.create colorname: $('#new_color_name').val()