दिलचस्प पोस्ट
पिप स्थापित "कनेक्शन त्रुटि के साथ विफल रहता है: प्रमाणपत्र सत्यापित करना विफल (_ssl.c: 598)" धराशायी सीमा स्ट्रोक की लंबाई और स्ट्रोक के बीच की दूरी को नियंत्रित करें सी # का उपयोग कर पैरामीटर के रूप में पास विधि सी # में जावा की एन्यूएम के बराबर क्या है? क्या मुझे JSLint या JSHint जावास्क्रिप्ट सत्यापन का उपयोग करना चाहिए? ओरेकल एसक्यूएल क्वेरी के माध्यम से पंक्ति में एक कॉलम के अल्पविराम से विभाजित मूल्य को विभाजित करें मोंगोडीबी या अन्य दस्तावेज़ आधारित डेटाबेस सिस्टम का उपयोग कब किया जाए? अज्ञात लंबाई के अनुक्रम से यादृच्छिक पर एन आइटम उठाएं मैं std :: map के मेमोरी उपयोग का अनुमान कैसे कर सकता हूं? एक अपारदर्शी अनुरोध क्या है, और इसके लिए क्या कार्य करता है? मैं jQuery के साथ IE 8 कैसे पता लगा सकता हूं? डिफ़ॉल्ट छवि गैलरी से चयनित चित्र की सही ओरिएंटेशन कैसे प्राप्त करें एंड्रॉइड: DrawableCompat का उपयोग कर टिंट java.io.StreamCorruptedException: अवैध स्ट्रीम हैडर: 54657374 यूनिटी में, यह कैसे बताने के लिए कि यह पहली बार है कि खेल खोला जा रहा है?

कैरियरविवे का उपयोग करके 4 एकाधिक छवि या फ़ाइल अपलोड करें

मैं Rails 4 और CarrierWave का उपयोग करके फ़ाइल चयन विंडो से एकाधिक छवियों को कैसे अपलोड कर सकता / सकती हूं? मेरे पास एक post_controller और post_attachments मॉडल है post_attachments मैं यह कैसे कर सकता हूँ?

क्या कोई एक उदाहरण प्रदान कर सकता है? क्या इसका एक सरल दृष्टिकोण है?

Solutions Collecting From Web of "कैरियरविवे का उपयोग करके 4 एकाधिक छवि या फ़ाइल अपलोड करें"

यह खरोंच से रेल 4 में कैरियरविवे का उपयोग करते हुए एकाधिक चित्र अपलोड करने का समाधान है

या आप काम कर रहे डेमो पा सकते हैं: एकाधिक अनुलग्नक रेल 4

बस इन चरणों का पालन करने के लिए

 rails new multiple_image_upload_carrierwave 

मणि फ़ाइल में

 gem 'carrierwave' bundle install rails generate uploader Avatar 

पोस्ट पाड़ बनाएँ

 rails generate scaffold post title:string 

पोस्ट_ैटकैचमेंट पाड़ बनाएँ

 rails generate scaffold post_attachment post_id:integer avatar:string rake db:migrate 

पोस्ट। आरबी में

 class Post < ActiveRecord::Base has_many :post_attachments accepts_nested_attributes_for :post_attachments end 

पोस्ट_एटैक्टमेंट.आरबी में

 class PostAttachment < ActiveRecord::Base mount_uploader :avatar, AvatarUploader belongs_to :post end 

Post_controller.rb में

 def show @post_attachments = @post.post_attachments.all end def new @post = Post.new @post_attachment = @post.post_attachments.build end def create @post = Post.new(post_params) respond_to do |format| if @post.save params[:post_attachments]['avatar'].each do |a| @post_attachment = @post.post_attachments.create!(:avatar => a) end format.html { redirect_to @post, notice: 'Post was successfully created.' } else format.html { render action: 'new' } end end end private def post_params params.require(:post).permit(:title, post_attachments_attributes: [:id, :post_id, :avatar]) end 

विचार / पदों / _form.html.erb में

 <%= form_for(@post, :html => { :multipart => true }) do |f| %> <div class="field"> <%= f.label :title %><br> <%= f.text_field :title %> </div> <%= f.fields_for :post_attachments do |p| %> <div class="field"> <%= p.label :avatar %><br> <%= p.file_field :avatar, :multiple => true, name: "post_attachments[avatar][]" %> </div> <% end %> <div class="actions"> <%= f.submit %> </div> <% end %> 

किसी पोस्ट के लिए अटैचमेंट और अटैचमेंट की सूची को संपादित करने के लिए विचारों / पदों / show.html.erb में

 <p id="notice"><%= notice %></p> <p> <strong>Title:</strong> <%= @post.title %> </p> <% @post_attachments.each do |p| %> <%= image_tag p.avatar_url %> <%= link_to "Edit Attachment", edit_post_attachment_path(p) %> <% end %> <%= link_to 'Edit', edit_post_path(@post) %> | <%= link_to 'Back', posts_path %> 

अनुलग्नक दृश्य / पोस्ट_ैटकैट्स / _form.html.erb को संपादित करने के लिए फॉर्म अपडेट करें

 <%= image_tag @post_attachment.avatar %> <%= form_for(@post_attachment) do |f| %> <div class="field"> <%= f.label :avatar %><br> <%= f.file_field :avatar %> </div> <div class="actions"> <%= f.submit %> </div> <% end %> 

Post_attachment_controller.rb में अपडेट विधि को संशोधित करें

 def update respond_to do |format| if @post_attachment.update(post_attachment_params) format.html { redirect_to @post_attachment.post, notice: 'Post attachment was successfully updated.' } end end end 

रेल 3 में मजबूत मापदंडों को परिभाषित करने की आवश्यकता नहीं है और जैसा कि आप दोनों मॉडल में attribute_accessible को परिभाषित कर सकते हैं और मॉडल स्वीकार करने के लिए accept_nested_attribute को स्वीकार कर सकते हैं क्योंकि विशेषता सुलभ को रेल 4 में बहिष्कृत किया गया है

एक अनुलग्नक को संपादित करने के लिए हम एक समय में सभी अनुलग्नकों को संशोधित नहीं कर सकते इसलिए हम अनुलग्नक को एक-एक करके बदल देंगे, या आप अपने नियम के अनुसार संशोधित कर सकते हैं, यहां मैं सिर्फ आपको दिखाता हूं कि किसी भी अटैचमेंट को कैसे अपडेट किया जाए।

अगर हम कैरियरवाव के दस्तावेज़ीकरण पर एक नज़र डालते हैं, तो यह वास्तव में बहुत आसान है

https://github.com/carrierwaveuploader/carrierwave/blob/master/README.md#multiple-file-uploads

मैं उत्पाद को मॉडल के रूप में उपयोग करूँगा जिसे मैं चित्रों को जोड़ना चाहता हूं, उदाहरण के तौर पर।

  1. मास्टर शाखा कैरियरविवे प्राप्त करें और इसे अपनी जेमफ़ाइल में जोड़ें:

     gem 'carrierwave', github:'carrierwaveuploader/carrierwave' 
  2. छवियों की एक सरणी होस्ट करने के लिए इच्छित मॉडल में एक कॉलम बनाएं:

     rails generate migration AddPicturesToProducts pictures:json 
  3. माइग्रेशन चलाएं

     bundle exec rake db:migrate 
  4. उत्पाद को मॉडल में चित्र जोड़ें

     app/models/product.rb class Product < ActiveRecord::Base validates :name, presence: true mount_uploaders :pictures, PictureUploader end 
  5. ProductsController में मजबूत परामर्श करने के लिए चित्र जोड़ें

     app/controllers/products_controller.rb def product_params params.require(:product).permit(:name, pictures: []) end 
  6. अपने फ़ॉर्म को कई चित्रों को स्वीकार करने की अनुमति दें

     app/views/products/new.html.erb # notice 'html: { multipart: true }' <%= form_for @product, html: { multipart: true } do |f| %> <%= f.label :name %> <%= f.text_field :name %> # notice 'multiple: true' <%= f.label :pictures %> <%= f.file_field :pictures, multiple: true, accept: "image/jpeg, image/jpg, image/gif, image/png" %> <%= f.submit "Submit" %> <% end %> 
  7. आपके विचारों में, आप चित्र सरणी को पार्स करने वाले चित्रों का संदर्भ दे सकते हैं:

     @product.pictures[1].url 

यदि आप किसी फ़ोल्डर से कई छवियां चुनते हैं, तो वह क्रम सटीक क्रम होगा, जिसे आप ऊपर से नीचे तक ले जा रहे हैं।

इसके अलावा मुझे पता चल गया कि एक से अधिक फाइल अपलोड कैसे अद्यतन करें और मैं इसे थोड़ा सा भी रीफ़्रैक्ट करता हूं। यह कोड मेरा है लेकिन आप बहाव को मिलता है

 def create @motherboard = Motherboard.new(motherboard_params) if @motherboard.save save_attachments if params[:motherboard_attachments] redirect_to @motherboard, notice: 'Motherboard was successfully created.' else render :new end end def update update_attachments if params[:motherboard_attachments] if @motherboard.update(motherboard_params) redirect_to @motherboard, notice: 'Motherboard was successfully updated.' else render :edit end end private def save_attachments params[:motherboard_attachments]['photo'].each do |photo| @motherboard_attachment = @motherboard.motherboard_attachments.create!(:photo => photo) end end def update_attachments @motherboard.motherboard_attachments.each(&:destroy) if @motherboard.motherboard_attachments.present? params[:motherboard_attachments]['photo'].each do |photo| @motherboard_attachment = @motherboard.motherboard_attachments.create!(:photo => photo) end end 

एसएसआर उत्तर में कुछ मामूली अतिरिक्त:

Acceptpts_nested_attributes_for आपको पैरेंट ऑब्जेक्ट के नियंत्रक को बदलने की आवश्यकता नहीं है तो अगर सही करने के लिए

 name: "post_attachments[avatar][]" 

सेवा मेरे

 name: "post[post_attachments_attributes][][avatar]" 

तो इन सभी नियंत्रक परिवर्तन जैसे ये बेमानी हो जाते हैं:

 params[:post_attachments]['avatar'].each do |a| @post_attachment = @post.post_attachments.create!(:avatar => a) end 

इसके अलावा आपको PostAttachment.new को मूल ऑब्जेक्ट फॉर्म में जोड़ना चाहिए:

विचार / पदों / _form.html.erb में

  <%= f.fields_for :post_attachments, PostAttachment.new do |ff| %> <div class="field"> <%= ff.label :avatar %><br> <%= ff.file_field :avatar, :multiple => true, name: "post[post_attachments_attributes][][avatar]" %> </div> <% end %> 

यह माता-पिता के नियंत्रक में इस परिवर्तन को बेमानी बना देगा:

 @post_attachment = @post.post_attachments.build 

अधिक जानकारी के लिए देखें फ़ील्ड रेलवे फ़ील्ड नहीं दिख रहा है, नेस्टेड फ़ॉर्म

यदि आप रेलवे 5 का उपयोग करते हैं, तो Rails.application.config.active_record.belongs_to_required_by_default मान को true से false (config / initializers / new_framework_defaults.rb में) के कारण एक बग के कारण स्वीकार करता है- अन्यथा accepts_nested_attributes_for (अन्यथा accepts_nested_attributes_for आमतौर पर रेल 5 के तहत काम नहीं करेगा) ।

1 संपादित करें:

नष्ट करने के बारे में जोड़ने के लिए :

मॉडल / पोस्ट.आरबी में

 class Post < ApplicationRecord ... accepts_nested_attributes_for :post_attachments, allow_destroy: true end 

विचार / पदों / _form.html.erb में

  <% f.object.post_attachments.each do |post_attachment| %> <% if post_attachment.id %> <% post_attachments_delete_params = { post: { post_attachments_attributes: { id: post_attachment.id, _destroy: true } } } %> <%= link_to "Delete", post_path(f.object.id, post_attachments_delete_params), method: :patch, data: { confirm: 'Are you sure?' } %> <br><br> <% end %> <% end %> 

इस तरह आप को बिल्कुल बाल ऑब्जेक्ट के नियंत्रक की ज़रूरत नहीं है ! मेरा मतलब है कि अब किसी भी PostAttachmentsController की आवश्यकता नहीं है। मूल ऑब्जेक्ट के नियंत्रक ( PostController ) के लिए, आप भी लगभग इसे बदल नहीं सकते हैं – वही चीज जो आप में बदलते हैं, वो श्वेतसूचीबद्ध पैरामीटर (बाल ऑब्जेक्ट से संबंधित पैरामीटर को शामिल करने के लिए) की सूची है:

 def post_params params.require(:post).permit(:title, :text, post_attachments_attributes: ["avatar", "@original_filename", "@content_type", "@headers", "_destroy", "id"]) end 

यही कारण है कि accepts_nested_attributes_for करने accepts_nested_attributes_for लिए बहुत अद्भुत है

इस मॉडल में मेरा दूसरा रिफ्लेक्टर है:

  1. मॉडल के लिए निजी विधियों को स्थानांतरित करें
  2. स्वयं के साथ @ motherboard बदलें

नियंत्रक:

 def create @motherboard = Motherboard.new(motherboard_params) if @motherboard.save @motherboard.save_attachments(params) if params[:motherboard_attachments] redirect_to @motherboard, notice: 'Motherboard was successfully created.' else render :new end end def update @motherboard.update_attachments(params) if params[:motherboard_attachments] if @motherboard.update(motherboard_params) redirect_to @motherboard, notice: 'Motherboard was successfully updated.' else render :edit end end 

मदरबोर्ड मॉडल में:

 def save_attachments(params) params[:motherboard_attachments]['photo'].each do |photo| self.motherboard_attachments.create!(:photo => photo) end end def update_attachments(params) self.motherboard_attachments.each(&:destroy) if self.motherboard_attachments.present? params[:motherboard_attachments]['photo'].each do |photo| self.motherboard_attachments.create!(:photo => photo) end end 

एसोसिएशन @post.post_attachments का उपयोग करते @post.post_attachments आपको @post.post_attachments सेट करने की आवश्यकता नहीं है