سؤال

ولدي صفحة حيث يمكن للمستخدم استيراد البيانات إلى الموقع. إما في شكل نسخة واللصق في منطقة النص من التفوق، أو عن طريق تحميل ملف .csv.

والشيكات تحكم إذا تم تحميل ملف CSV - إذا كان الأمر كذلك يقوم بمعالجة هذا، وإلا فإنه سيتم معالجة المحتوى الذي تم لصقه. (العمل على افتراض أن للمستخدم اختيار خيار واحد فقط في الوقت الحالي).

ونسخ ولصق جزء يعمل تماما، ومع ذلك، تنشأ مشكلة عندما أحاول معالجة ملف CSV التي تم تحميلها:

وأحصل على خطأ:

<اقتباس فقرة>   

لا يمكن تحويل   ActionController :: UploadedTempfile   في سلسلة

#events_controller
  def invite_save
    @event = Event.find(params[:id])

    if params[:guest_list_csv]
      lines = parse_csv_file(params[:guest_list_csv])
    else
      #csv file uploaded
      lines = params[:guest_list_paste]
    end

    if lines.size > 0
      lines.each do |line|
          new_user(line.split)
      end 
      flash[:notice] = "List processing was successful."
    else
      flash[:error] = "List data processing failed."
    end

  end
private

  def parse_csv_file(path_to_csv)
    lines = []

    require 'fastercsv' 

    FasterCSV.foreach(path_to_csv) do |row|
      lines << row
    end
    lines
  end

  def new_user(line)
     #code to create new user would go here
  end

وأنا أحاول أساسا لتحميل ومعالجة CSV في عمل واحد على نحو سلس، بدلا من أن يكون للحصول على المستخدم الضغط على زر "عملية".

هل كانت مفيدة؟

المحلول

في خط # 6 أعلاه

if params[:guest_list_csv]
  lines = parse_csv_file(params[:guest_list_csv])
else
  #csv file uploaded
  lines = params[:guest_list_paste]
end

والمشكلة هي ليست params[:guest_list_csv] سلسلة الفعلية، ولا هو المسار، لأنه كائن ملف. ما تحتاجه هو صراحة استدعاء #path على ذلك.

# line 6
  lines = parse_csv_file(params[:guest_list_csv].path)

يرجى محاولة ومعرفة ما اذا كان حل مشكلتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top