2012-03-20 27 views
6

Tôi có ứng dụng đường ray ban đầu đã sử dụng Paperclip để tải lên tệp, vì tôi thấy rằng CarrierWave dường như đã có tính năng loại 'tải lên liên tục' trên biểu mẫu, tôi đã quyết định thử .CarrierWave không lưu tải lên sau khi mẫu hiển thị lại

Theo quan điểm của tôi, tôi có như sau:

= f.input :attachment 
= f.hidden_field :attachment_cache 

nào lưu trữ một cách chính xác các tập tin nếu các hình thức không xác nhận và được hiển thị lại, tuy nhiên khi tôi sửa lỗi xác nhận và gửi lại, tập tin đính kèm không được xử lý.

Started POST "/section/model" for 127.0.0.1 at 2012-03-20 08:51:56 +0000 
    Processing by Client::WishesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"zkdPQBsAnsNzx555rkwZ5+clfnLaXg+NtL+GdFei188=", "model"=>{"title"=>"Sample", "content"=>"Sample content", "contact_name"=>"Mr Sample", "contact_email"=>"[email protected]", "attachment_cache"=>"20120320-0851-42559-1644/SampleAttachment.pdf"}, "commit"=>"Create Wish"} 
    Client Load (0.3ms) SELECT `clients`.* FROM `clients` WHERE `clients`.`id` = 1 LIMIT 1 
    (0.2ms) BEGIN 
    SQL (0.4ms) INSERT INTO `models` (`attachment`, `client_id`, `contact_email`, `contact_name`, `content`, `created_at`, `status`, `title`, `updated_at`, `upload_content_type`, `upload_file_name`, `upload_file_size`, `upload_updated_at`) VALUES (NULL, 1, '[email protected]', 'Mr Sample', 'Sample content', '2012-03-20 08:51:56', 'Unresolved', 'Sample', '2012-03-20 08:51:56', NULL, NULL, NULL, NULL) 

Dường như chuyển đúng tệp đính kèm qua tệp đính kèm_cache trong thông số, nhưng sau đó không lưu tệp đính kèm vì nó không có trường tham số [: model] [: attachment].

Nó không nói thêm bất kỳ bước nào trên phần sóng mang để thực hiện tải lên hoạt động trên biểu mẫu hiển thị lại trên CarrierWave GitHub.

+0

Nó hoạt động nếu tôi tạo/cập nhật với chuyển nhượng hàng loạt và đặt các biến riêng biệt, nhưng tôi đã tự hỏi liệu có cách nào để thực hiện nó mà không cần gán hàng loạt không? – HaaR

+0

Cân nhắc [mở một vé] (https://github.com/jnicklas/carrierwave/issues) cho việc này. –

+1

bạn có tìm thấy câu trả lời cho điều này không? – user749798

Trả lời

3

Hãy thử Populating giá trị của avatar_cache để khi xác nhận thất bại, nó sẽ được nhập sẵn trong các hình thức:

= f.hidden_field :attachment_cache, :value => @model.attachment_cache 

đâu @model là tên của mô hình của bạn

Điều này dường như làm việc cho tôi khi cùng một hình thức được tải lại nhiều lần (tức là khi xác nhận không thành công nhiều lần). Tôi nghĩ họ đã bỏ điều này ra khỏi tài liệu.

+0

Điều này không hoạt động đối với hình thức lồng nhau – Francisco

+0

Điều này không phù hợp với tôi (Rails 4.2.5). – fatuhoku

+0

Bạn cũng phải thêm tên trường vào tham số mạnh –

0

Nguyên nhân là 'thay đổi?' kiểm tra, khi lỗi xác nhận, chúng tôi chuyển tệp được lưu trong bộ nhớ cache trong trường {c}} _cache không phải là cột bảng cơ sở dữ liệu, vì vậy nó không lưu đối tượng vì không có gì thay đổi trong quan điểm của AR.

tôi đã làm một hack để làm công việc này bằng cách tạo ra một phương pháp trong mô hình đó có chứa các file: "dữ liệu" là tên cột

def data_cache=(text) 
    @changed_attributes.merge!("data" => nil) 
    super 
end 

Hope this helps.

+0

Tôi đã chỉnh sửa để xóa cốt truyện khỏi câu trả lời này. Câu trả lời phải trả lời câu hỏi và không bao gồm thông tin không liên quan. Vui lòng xem lại các thay đổi của tôi và chào mừng bạn đến với StackOverflow! – BradleyDotNET

0

Đối với tôi, vấn đề là tôi có

accepts_nested_attributes_for :avatars, allow_destroy: true, reject_if: lambda { |avatar| avatar[:file].blank? } 

Vì vậy, tôi đã từ chối hồ sơ vì các tập tin không có ở đó

Điều quan trọng cần lưu ý là các tập tin tự nó không tồn tại , nhưng chỉ là bộ nhớ cache của tệp.Đó là lý do tại sao carrierwave docs đề nghị:

Nó có thể là một ý tưởng tốt để hiển thị cho người dùng biết một tập tin đã được tải lên, trong trường hợp hình ảnh, một thumbnail nhỏ sẽ là một chỉ số tốt:

1

đó là một chút của một câu hỏi cũ, nhưng nó làm việc cho tôi sau khi tôi thêm các thông số mạnh mẽ với bộ điều khiển, như thế này:

#controller 
def object_params 
    params.require(:object).permit(:attachment, :attachment_cache) 
end 

#view 
<%= f.file_field :attachment %> 
<%= f.hidden_field :attachment_cache %> 
1

này sẽ giải quyết vấn đề của bạn 100%

hãy có một cái nhìn tại

accepts_nested_attributes_for :avatars, allow_destroy: true, 
reject_if: lambda { |avatar| avatar[:avatar].blank? and avatar[:avatar_cache].blank?} 

Ở đây chúng ta sẽ từ chối avatar khi cả hai avatar[:avatar]avatar[:avatar_cache] là trống

0

Để thêm vào câu trả lời @ marko của:

Nếu bạn đang sử dụng Active Quản trị, bạn' sẽ cần thêm tệp được lưu vào dòng allow_params.

permit_params: :title, :file, :file_cache 
Các vấn đề liên quan