Я пытаюсь заставить свои базовые ассоциации работать в приложении rails, и у меня возникают трудности при обновлении существующих моделей. В частности, Rails выдает следующую ошибку:
Начато PUT "/ posts / 2" для 127.0.0.1 в 2012-01-04 02:36:14 + 1000
Обработка PostsController # update как JSON Параметры:
{ "Пост" => { "содержание" => "Seconderona",
"creat_at" => "2012-01-03T10: 51: 09Z", "id" => 2, "title" => "Второй тест
post "," updated_at "=>" 2012-01-03T10: 51: 09Z "," comments "=> [{}]},
"id" => "2"} Post Load (0.2ms) ВЫБЕРИТЕ "posts". * FROM "posts" WHERE
"posts". "id" =? LIMIT 1 [["id", "2"]] ПРЕДУПРЕЖДЕНИЕ: нельзя назначить по массе
Защищенные атрибуты: идентификатор завершен 500 Внутренняя ошибка сервера в 15 мс
ActiveRecord :: AssociationTypeMismatch (Комментарий (# 70104367824560)
ожидал, получил
ActiveSupport :: HashWithIndifferentAccess (# 70104367278120)):
app / controllers / posts_controller.rb: 62: in block in update'<br>
app/controllers/posts_controller.rb:61:in
update '
Несколько вещей:
Это срабатывает (например):
c = window.router.comments.models[0]
c.save({content: 'Changed content'})
Кроме того, да, в модели присутствует 'accepts_nested_attributes_for'.
(Оскорбительный) код, приведенный ниже, взят в значительной степени дословно из книги thougtbot «Магистраль на рельсах», и я также попробовал следовать документации по гемам с реляционными магистралями. Оба поднимают эту ошибку. Любые идеи приветствуются, код ниже
МОДЕЛЬ "ПОЧТА" ЖЕЛЕЗНОДОРОЖНЫХ
class Post < ActiveRecord::Base
has_many :comments
accepts_nested_attributes_for :comments
def as_json(options = nil)
super((options || {}).merge(include: { comments: { only: [content] } } ))
end
end
МОДЕЛЬ "КОММЕНТАРИИ" ЖЕЛЕЗНОДОРОЖНЫХ
class Comment < ActiveRecord::Base
belongs_to :post
accepts_nested_attributes_for :post
def as_json(options = nil)
super((options || {}).merge(include: { post: { only: [:title, :content]}}))
end
end
BACKBONE POST CONTROLLER
class Backbonerelationaldemo.Models.Post extends Backbone.Model
paramRoot: 'post'
initialize: () ->
comments = new Backbonerelationaldemo.Collections.CommentsCollection
comments.reset(@get('comments'))
@setComments(comments)
setComments: (comments) ->
@comments = comments
class Backbonerelationaldemo.Collections.PostsCollection extends Backbone.Collection
model: Backbonerelationaldemo.Models.Post
url: '/posts'
КОНТРОЛЛЕР КОММЕНТАРИЙ BACKBONE
class Backbonerelationaldemo.Models.Comment extends Backbone.Model
paramRoot: 'comment'
initialize: () ->
if (@has('post'))
@setPost(new Backbonerelationaldemo.Models.Post(@get('post')))
setPost: (post) ->
@post = post
class Backbonerelationaldemo.Collections.CommentsCollection extends Backbone.Collection
model: Backbonerelationaldemo.Models.Comment
url: '/comments'