2013-07-10 42 views
6

Loại mới với điều Rails, trong một chút tại chỗ.Lưu mô hình lồng nhau trong Rails 4

Một trong các mô hình phụ thuộc vào nhau trong liên kết has_many/owned_to.

Về cơ bản, khi tạo "Đăng" trên ứng dụng của tôi, người dùng cũng có thể đính kèm "Hình ảnh". Lý tưởng nhất là hai mô hình riêng biệt. Khi người dùng chọn một bức ảnh, một số JavaScript tải nó lên Cloudinary và dữ liệu trả về (ID, chiều rộng, chiều cao, vv) được JSON xâu chuỗi và đặt trên một trường ẩn.

# The HTML 
= f.hidden_field :images, :multiple => true, :class => "image-data" 

# Set our image data on the hidden field to be parsed by the server 
$(".image-data").val JSON.stringify(images) 

Và tất nhiên, mối quan hệ tồn tại trong mô hình bài viết của tôi

has_many :images, :dependent => :destroy 
accepts_nested_attributes_for :images 

và mô hình hình ảnh của tôi

belongs_to :post 

Nơi tôi đang bị mất là phải làm gì với dữ liệu hình ảnh tuần tự trên phương thức tạo của bộ điều khiển Post? Đơn giản chỉ cần phân tích cú pháp JSON và tiết kiệm nó không tạo ra các mô hình hình ảnh với các dữ liệu sau khi tiết kiệm (và không cảm thấy phải):

params[:post][:images] = JSON.parse(params[:post][:images]) 

Tất cả điều này về cơ bản lên đến đỉnh điểm với một cái gì đó giống như các thông số sau:

{"post": {"title": "", "content": "", ..., "images": [{ "public_id": "", "bytes": 12345, "format": "jpg"}, { ..another image ... }]}} 

Toàn bộ quá trình này có vẻ hơi phức tạp - Tôi phải làm gì bây giờ, và có cách nào tốt hơn để làm những gì tôi đang cố gắng làm ngay từ đầu không? (Ngoài ra là các thông số mạnh mẽ cần thiết cho các thuộc tính lồng nhau như thế này ...?)

EDIT:

Tại thời điểm này tôi đã nhận lỗi này:

Image(#91891690) expected, got ActionController::Parameters(#83350730) 

đến từ dòng này ...

@post = current_user.reviews.new(post_params) 

Dường như nó không tạo hình ảnh từ thuộc tính lồng nhau nhưng được mong đợi. (Điều tương tự cũng xảy ra khi: tự động lưu là có hay không).

+0

Tôi có cùng vấn đề chính xác – nduplessis

+0

Mb có thể giúp http://stackoverflow.com/questions/10878930/got-activerecordassociationtypemismatch-on-model-save – user2915517

Trả lời

6

Chỉ gặp sự cố này với lỗi ActionController :: Parameters. Bạn cần đảm bảo rằng bạn cho phép tất cả các thông số cần thiết trong posts_controller của mình, như vậy:

def post_params 
    params.fetch(:post).permit(:title, :content, 
          images_attributes: [:id, :public_id, :bytes, :format]) 
end 

Điều quan trọng là đảm bảo bạn cho phép thuộc tính image.id.

0

accepts_nested_attributes_for nên quan tâm đến điều này cho bạn. Vì vậy, việc thực hiện Post.create(params[:post]) cũng nên quản lý các thuộc tính hình ảnh lồng nhau. Điều có thể xảy ra là bạn chưa chỉ định một autosave về mối quan hệ has_many. Vì vậy, bạn có thể muốn xem điều này có tạo ra sự khác biệt hay không:

has_many :images, :dependent => :destroy, :autosave => true 

Điều đó cũng nên lưu hình ảnh khi bạn lưu bài đăng.

+0

Cảm ơn bạn đã trả lời. Tôi đã thử điều đó, mặc dù nó dường như không tạo ra bất kỳ sự khác biệt nào, mặc dù tôi đã nhận được một câu trả lời thú vị mà tôi đã chỉnh sửa ở trên ('Hình ảnh được mong đợi, nhưng có tham số' cho ngắn gọn). – ICDevin

1

Bạn phải xây dựng các params như thế này:

params[:post][:images_attributes] = { ... } 

Bạn cần *_attributes vào tên chủ chốt của images.

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