7

Trong ứng dụng Ruby 2/Rails 4, tôi đang cố gắng sử dụng các hành vi như thẻ có thể kết hợp với active_model_serializers để tạo JSON API sẽ xuất thẻ của tôi cùng với các thông số mô hình khác.Lỗi tải trước JSON cho các thẻ hoạt động như thẻ có thể gắn thẻ bằng cách sử dụng các trình tuần tự hóa mô hình hoạt động

Trước tiên một số nền/động lực cho vấn đề này: JSON đang được đưa vào dữ liệu ember/ember, tính đến thời điểm viết bài này đã xóa hỗ trợ cho các bản ghi được nhúng trong JSON. Có một sửa chữa được cho là trong số documentation về điều này, nhưng tôi thấy nó vụng về và cũng không thực sự làm cho nó hoạt động. Vì tôi là một người mới chơi Ember và cảm thấy thoải mái hơn với Rails, tôi nghĩ tôi sẽ cố giải quyết vấn đề theo cách khác, bằng cách tải lại bản ghi thẻ cùng với hồ sơ tài liệu. Tôi thích giải pháp này tốt hơn vì nó có ý nghĩa hơn cho ứng dụng của tôi, nhưng tôi cũng không thể làm được điều này.

Dưới đây là một ví dụ: Giả sử tôi có một mô hình tài liệu được sử dụng hành vi-as-taggable-on:

class Document < ActiveRecord::Base 
    acts_as_taggable 
    # other code omitted 

tôi đã thiết lập cơ sở dữ liệu với một tài liệu với một thẻ. Bây giờ chúng ta xem xét các trường hợp sau:

1. Full Object Nhúng: Với serializer sau:

class DocumentSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :tags 

JSON của tôi có định dạng sau (sử dụng Rails 4 UUIDs):

{ 
    "documents": [ 
    { 
     "id": "c41460fa-2427-11e3-8702-0800270f33f4", 
     "tags": [ 
     { 
      "id": "a33fc396-2428-11e3-8eeb-0800270f33f4", 
      "name": "test" 
     } 
     ] 
    } 
    ] 
} 

2. ID Nhúng: Sử dụng bộ nối tiếp

class DocumentSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :tags, embed: :id 

JSON của tôi bây giờ trông giống như:

{ 
    "documents": [ 
    { 
     "id": "c41460fa-2427-11e3-8702-0800270f33f4", 
     "tag_ids": [ 
     "a33fc396-2428-11e3-8eeb-0800270f33f4" 
     ] 
    } 
    ] 
} 

3. ID Nhúng với Tags tải hai chiều: Theo tài liệu active_model_serializers, tôi sẽ có thể làm

class DocumentSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :tags, embed: :id, include: true 

nhưng điều này không làm việc . Thay vào đó, tôi nhận được NoMethodError:

undefined method `object' for #<ActsAsTaggableOn::Tag:0x007f258cf1db38> 

Tôi đã thử tìm kiếm sự cố này nhưng chưa tìm thấy bất kỳ điều gì hữu ích cho đến thời điểm này. Tôi cũng không thể tìm thấy bất kỳ tài liệu nào về đá quý liên quan đến việc sử dụng với đá quý khác. Sự nghi ngờ của tôi lúc này là nó có cái gì đó liên quan đến cách thực hiện hành vi-như-taggable-on, rằng nó không phải là một mối quan hệ đơn giản? Có ai có thể cung cấp một số đầu vào về vấn đề này? Cảm ơn trước!

+0

Tôi có thể yêu cầu bạn làm thế nào để xử lý mối quan hệ với ember? Làm cách nào để bạn thêm thẻ vào tài liệu? CreateRecord? –

Trả lời

11

Đã sửa lỗi! Bật ra để sideload các thẻ, serializer tương ứng phải được xác định. Tôi không biết điều này, bởi vì các tài liệu hướng dẫn dường như ngụ ý rằng có một serializer là tùy chọn, và một số mặc định sẽ được sử dụng trong trường hợp không có một. Rõ ràng đây không phải là trường hợp nếu bạn muốn sử dụng tùy chọn include: true. Key trong tầm nhìn đến từ here, cảm ơn rất nhiều!

Để hoàn thành, tôi sẽ hiển thị những gì tôi đã làm.Tôi tạo ra tag_serializer.rb với đoạn mã sau:

module ActsAsTaggableOn 
    class TagSerializer < ActiveModel::Serializer 
    attributes :id, :name 
    end 
end 

và bây giờ JSON của tôi:

{ 
    "tags": [ 
     { 
     "id": "a33fc396-2428-11e3-8eeb-0800270f33f4", 
     "name": "test" 
     } 
    ], 
    "documents": [ 
     { 
     "id": "c41460fa-2427-11e3-8702-0800270f33f4", 
     "tag_ids": [ 
      "a33fc396-2428-11e3-8eeb-0800270f33f4" 
     ] 
     } 
    ] 
} 
+1

cũng, hãy chắc chắn lưu 'tag_serializer.rb' trong' app/serializers/actions_as_taggable_on/tag_serializer.rb' để Rails có thể tự động tải nó – davekaro

+0

Nó hoạt động cho tôi nhưng tôi cần phải loại bỏ mô-đun đó ActsAsTaggableOn – icemelt

Các vấn đề liên quan