2013-10-31 11 views
13

मैं कैरियरवेव, रेल 4, और एकाधिक अपलोड एक साथ काम करने की कोशिश कर दीवार के खिलाफ अपने सिर को टक्कर लगी हूं। मैं एक और फ़ाइल अपलोड कर सकता हूं जैसे कि इस और कई अन्य परियोजनाओं में ठीक काम करता है। बस एक मॉडल ट्रांसक्रिप्शन कहा जाता है पर अपलोड करने और अपलोड प्रत्येक दस्तावेज़ के लिए एक रिकॉर्ड बनाने के लिए इच्छुक -कैरियरवेव, रेल 4, और एकाधिक अपलोड

यह एक नेस्टेड स्थिति नहीं है।

मैं carrierwave के लिए इस्तेमाल किया "दस्तावेज़" क्षेत्र घोषित करने के लिए सही तरीका खोजने के लिए नहीं कर पा रहे मजबूत मानकों को मान्यता देने के लिए एक सरणी के रूप में

mount_uploader :document, DocumentUploader 

माउंट।

मैं श्वेतसूचीकरण की कोशिश की है: whitelisted[:document] = params[:transcription]['document'],

एक सरणी के रूप में "दस्तावेज़" की घोषणा:

params.require(:transcription).permit(..... ,:document => []) 

params.require(:transcription).permit(..... , { document: [] }) 

यह सभी को और अधिक की तरह मैं एक नेस्टेड मॉडल के लिए सरणी घोषणा कर रहा हूँ, लेकिन मैं वास्तव में चाहते हैं लगता है एकाधिक => true

यानी: 4 के मजबूत मापदंडों बस "दस्तावेज़" सरणी file_field द्वारा बनाई गई, देखने के लिए रेल। लॉग से: form-data; name=\"transcription[document][]

किसी को सफलतापूर्वक मजबूत मानकों के साथ रेल 4 में एक से अधिक अपलोड पूरा किया गया है? यदि ऐसा है तो कृपया साझा करें?

धन्यवाद ...

चीयर्स,

विधेयक

उत्तर

1

CarrierWave कई अपलोड का समर्थन नहीं करता है। यह एक एकल फ़ाइल को एक ही फ़ील्ड से जोड़ने के लिए डिज़ाइन किया गया है।

आप एक से अधिक अपलोड चाहते हैं, तो आप या तो एक से अधिक (एक CarrierWave अपलोड करने वाले के साथ प्रत्येक) फ़ील्ड, या एक से अधिक ऑब्जेक्ट एक भी CarrierWave अपलोड करने वाले क्षेत्र के साथ प्रत्येक की जरूरत है।

multiple विशेषता भी असमर्थित है, इसलिए यदि आप इसका उपयोग करते हैं, तो यह पैरामीटर को सही तरीके से असाइन करने के लिए पूरी तरह से आपके ऊपर है।

+1

यह सच नहीं है। यह एकल क्षेत्र के भीतर एकाधिक अपलोड का समर्थन करता है। मेरा जवाब देखें वाहकवेव बहुत अधिक प्रदान करता है। – SSR

+1

बस स्पष्ट होने के लिए: आपका समाधान एकाधिक ऑब्जेक्ट्स (post_attachments) का उपयोग करता है, प्रत्येक एक अपलोडर के साथ, और "एकाधिक" विशेषता के उपयोग के लिए सही तरीके से असाइन किए गए पैरामीटर प्राप्त करने के लिए आवश्यक मैन्युअल कार्य प्रदर्शित करता है। आपने दिखाया है कि ओपी क्या करना चाहता था, लेकिन यह उपरोक्त झूठ का कोई भी हिस्सा नहीं बनाता है। – Taavo

+0

समय आगे बढ़ता है। पृथ्वी स्पिन और धीरे-धीरे बदलती है, और कैरियरवेव अब बहु-फ़ाइल अपलोड को मूल रूप से समर्थन देता है। हालांकि यह करने का वाहकवेव तरीका एक बदसूरत हैक (एक सरणी का उपयोग कर एक फ़ील्ड में सभी फाइलों का संदर्भ देना) है कि मैं उपयोग से बचने के लिए। इसके बजाय एसएसआर के समाधान के साथ जाओ। –

0

मैं करूंगा एक मॉडल एक क्षेत्र है कि घुड़सवार के साथ दस्तावेज़ बनाएं जिसका नाम

class Documents < ActiveRecord::Base 
    belongs_to :transcription 

    mount_uploader :doc, DocumentUploader 
end 

class Transcriptions < ActiveRecord::Base 
    has_many :documents 
end 

और मैं अभी भी उपयोगकर्ता मेरी नियंत्रक में नीचे लाइन होगा:

params.require(:transcription).permit(..... , { document: [] }) 
36

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

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

rails new multiple_image_upload_carrierwave 

मणि फ़ाइल में

gem 'carrierwave' 
bundle install 
rails generate uploader Avatar 

पद पाड़

rails g scaffold post title:string 

बनाएं post_attachment पाड़ बनाएं

rails g scaffold post_attachment post_id:integer avatar:string 

rake db:migrate 

post.rb

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

post_attachment.rb

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, :post_id => @post.id) 
     end 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
    else 
     format.html { render action: 'new' } 
    end 
    end 
end 

def update 
    respond_to do |format| 
    if @post.update(post_params) 
     params[:post_attachments]['avatar'].each do |a| 
     @post_attachment = @post.post_attachments.create!(:avatar => a, :post_id => @post.id) 
     end 
    end 
    end 

    def destroy 
    @post.destroy 
    respond_to do |format| 
     format.html { redirect_to @post } 
     format.json { head :no_content } 
    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 %> 

    <% if params[:controller] == "post" && params[:action] == "edit" %> 
    <% @post.post_attachments.each do |p| %> 
     <%= image_tag p.avatar, :size => "150x150" %> 
    <% end %> 
    <% 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, :size => "150x150" %> 
    <%= link_to "Destroy", p, method: :delete %> 
<% end %> 

<%= link_to 'Edit', edit_post_path(@post) %> | 
<%= link_to 'Back', posts_path %> 

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

+0

ग्रेट पोस्ट @ एसएसएसआर, केवल एक ही अपलोड मैं काम करने में कामयाब रहा हूं। मान लीजिए कि आप इसे थोड़ा विस्तारित करने में सक्षम होंगे? वर्तमान स्वरूप में जब मूल मॉडल होता है तो फ़ाइलों को हटाया नहीं जाता है। (या मेरे लिए मत), और मैं सोच रहा हूं कि मैं पोस्ट को संपादित करने और उसके साथ अनुलग्नक कैसे संपादित करूंगा। – Darkstarone

+0

अनिवार्य रूप से मैं सोच रहा हूं कि post_controller.rb अनुलग्नकों को सही ढंग से संपादित और हटाने की तरह दिखता है? – Darkstarone

+0

धन्यवाद, यह मेरी मदद करता है मेरा विचार था! – Rubyrider

0

इस लिए सबसे अच्छा तरीका है कि मैं acros आए हैं एस CarrierWave के मूल दृष्टिकोण का उपयोग कर रहा है। यदि आपके पास पहले से ही एक फ़ाइल अपलोड किया गया है, तो देशी दृष्टिकोण के साथ एकाधिक फ़ाइल अपलोड करने में 5 मिनट से भी कम समय लगता है। https://github.com/carrierwaveuploader/carrierwave#multiple-file-uploads

संबंधित मुद्दे