2012-06-20 20 views
5

Tôi là một số lời khuyên liên quan đến xử lý dữ liệu biểu mẫu lồng nhau và tôi sẽ rất biết ơn đối với bất kỳ thông tin chi tiết nào.CarrierWave và các biểu mẫu lồng nhau lưu đối tượng ảnh trống nếu ảnh: tiêu đề được bao gồm trong biểu mẫu

Vấn đề là tôi không chắc chắn 100% tại sao tôi yêu cầu mã sau đây trong mô hình của tôi

accepts_nested_attributes_for :holiday_image, allow_destroy: true, :reject_if => lambda { |a| a[:title].blank? } 

Tôi không hiểu tại sao tôi yêu cầu để nguyên vẹn trên vào hiệp hội accepts_nested_attributes_for tôi:

:reject_if => lambda { |a| a[:title].blank? } 

Nếu tôi xóa điều này: reject_if lambda, nó sẽ lưu một đối tượng ảnh kỳ nghỉ trống trong cơ sở dữ liệu. Tôi đoán vì nó lấy trường tiêu đề từ biểu mẫu dưới dạng một chuỗi rỗng?

Tôi đoán câu hỏi của mình là, tôi đang làm điều này đúng hay có cách nào tốt hơn trong hình thức lồng nhau này nếu tôi muốn mở rộng mô hình HolidayImage của mình để bao gồm nhiều chuỗi hơn như mô tả, ghi chú?

Xin lỗi Nếu tôi không thể gọn gàng hơn.

Ứng dụng kỳ nghỉ đơn giản của tôi.

# holiday.rb 
class Holiday < ActiveRecord::Base 
    has_many :holiday_image 
    accepts_nested_attributes_for :holiday_image, allow_destroy: true, :reject_if => lambda { |a| a[:title].blank? } 

    attr_accessible :name, :content, :holiday_image_attributes 

end 

Tôi đang sử dụng CarrierWave để tải lên hình ảnh.

# holiday_image.rb 
class HolidayImage < ActiveRecord::Base 
    belongs_to :holiday 
    attr_accessible :holiday_id, :image, :title 

    mount_uploader :image, ImageUploader 
end 

Bên _form của tôi một phần có một khối field_for

<h3>Photo gallery</h3> 
<%= f.fields_for :holiday_image do |holiday_image| %> 
<% if holiday_image.object.new_record? %> 

    <%= holiday_image.label :title, "Image Title" %> 
    <%= holiday_image.text_field :title %> 
    <%= holiday_image.file_field :image %> 

<% else %> 

    Title: <%= holiday_image.object.title %> 
    <%= image_tag(holiday_image.object.image.url(:thumb)) %> 
    Tick to delete: <%= holiday_image.check_box :_destroy %> 

<% end %> 

Cảm ơn một lần nữa vì sự kiên nhẫn của bạn.

+0

Tôi có cùng vấn đề – smoothdvd

Trả lời

1

accepts_nested_attributes_for thường được sử dụng để xây dựng trẻ em trong khi giao hàng loạt (khi tạo bản ghi mới, xây dựng bất kỳ mô hình được liên kết nào). Ví dụ: nếu bạn có mô hình như Userhas_manyUserPhotos, bạn có thể thực hiện nhiều UserPhotos trong khi tạo một User và tất cả được tạo trên số User tạo.

Tôi không tin rằng bạn cần xử lý các thuộc tính lồng nhau vì bạn chỉ đang gắn một hình ảnh (ImageUploader) trên một mô hình (HolidayImage). Điều này cung cấp cho mô hình HolidayImage một trường đơn lẻ, :image, mà CarrierWave sẽ sử dụng để gắn một phiên bản của ImageUploader.

Có một vài phương pháp để xử lý này, nhưng đây là một số thông tin cơ bản bạn nên biết:

  1. Bạn có thể sử dụng validates_presence_of :image để đảm bảo :image có mặt. Điều này hoạt động vì trình tải lên được gắn thực hiện phương thức present? được API xác thực sử dụng (xem Wave Wave của Nhà cung cấp dịch vụ theo số Validating uploads with ActiveRecord). Bằng cách này bạn không phải kiểm tra nếu tiêu đề được đặt, nhưng thay vào đó có thể kiểm tra xem hình ảnh đã được tải lên chưa trước khi cho phép tạo mô hình. Tất nhiên bạn nên xử lý các xác nhận không thành công khi cần thiết.

  2. Bạn có thể thêm before_save làm bất cứ điều gì bạn muốn, có thể yêu cầu CarrierWave nếu hình ảnh đó hiện diện hoặc chỉ được tải lên. Trong trường hợp của bạn, bạn có thể gọi image.present?image_changed? tương ứng để kiểm tra điều này trong mô hình HolidayImage của bạn.Xem this CarrierWave How To để biết ví dụ.

  3. Nếu bạn muốn chấp nhận nhiều hình ảnh ở dạng lồng nhau, hãy xem this CarrierWave How To khi sử dụng accept_nested_attributes_for.

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