-3

新しいビューにメッセージを表示しようとしています

ここにライブデモがあります:

http://code.runnable.com/VrUvfZPOiiVooTAU/importing-excel-files-for-ruby-on-rails

コントローラーは次のとおりです。

def new
end

def create
   @errors = User.import(params[:file])          
   if @errors.present? 
     render :new;
     return; 
   end
end

これがビューです

 Import
 <%= form_tag user_management_users_path, multipart: true do %>
  <%= file_field_tag :file  %>
  <%= submit_tag "Import" %>
 <% end %>


 <% if @errors %>
   <% @errors.each do |message| %>
     <%= message %> 
   <% end %>
 <% end %>

モデルは次のとおりです。

def self.import(file)
 @errors = []
 spreadsheet = open_spreadsheet(file)
  (2..spreadsheet.last_row).each do |i|  
      name     = spreadsheet.cell(i,'A')    
      lastname = spreadsheet.cell(i,'B')
      doc_nat  = spreadsheet.cell(i,'C')

      user = User.create(:name => name,
                                 :lastname =>lastname,
                                 :doc_nat =>doc_nat)
      if user.save
        # stuff to do on successful save 
      else
        user.errors.full_messages.each do |message|
          @errors << "Issue line #{i}, column #{message}"
        end
      end

 end    
end

def self.open_spreadsheet(file)
  case File.extname(file.original_filename)
  when ".csv" then Roo::CSV.new(file.path, csv_options: {encoding: "iso-8859-1:utf-8"})
  when ".xls" then  Roo::Excel.new(file.path, packed: false, file_warning: :ignore)
  when ".xlsx" then Roo::Excelx.new(file.path, nil, :ignore)
  else raise "Unknown file type: #{file.original_filename}"
end

終わり

インデックス ビューで ROW PROBLEM を示すメッセージを表示する方法を見つけようとしています。

たとえば、既に存在するユーザーを追加していて、次を示すメッセージを表示したい

ROW 1 already exist
Row 2 is duplicated
Row 1 must be string 
or something like that 

しかし、Excelをアップロードした後、メッセージではなく数字を取得するだけです:

Issue line 2, column already exist
Issue line 3, column already exist

数字を取得するだけです:

2  3
4

1 に答える 1

3

ユーザーを保存できない場合は、検証に失敗したことを意味します (ただし、現時点で唯一の検証はオンになっていdoc_natます...「文字列でなければならない」条件などの検証を追加することもできます)。

検証に失敗した active_record オブジェクトのobject.errors.full_messages場合、検証時に見つかったすべてのエラーの配列があります。

そう...

def self.import(file)
  @errors = []
  spreadsheet = open_spreadsheet(file)
  (2..spreadsheet.last_row).each do |i|  
    name     = spreadsheet.cell(i,'A')    
    lastname = spreadsheet.cell(i,'B')
    doc_nat  = spreadsheet.cell(i,'C')

    user = User.new(:name => name,
                       :lastname =>lastname,
                       :doc_nat =>doc_nat)
    if user.save
      # stuff to do on successful save 
    else
      user.errors.full_messages.each do |message|
        @errors << "La información de la línea #{i}, columna #{message}"
      end
    end
  end 
  @errors #  <- need to return the @errors array   
end

そして視界に…

<% if @errors %>
  <% @errors.each do |message| %>
    <%= message %>
  <% end %>
<% end %>
于 2016-02-06T00:13:47.467 に答える