gpt4 book ai didi

ruby-on-rails - ruby rails : Validate CSV file

转载 作者:太空宇宙 更新时间:2023-11-03 17:45:28 24 4
gpt4 key购买 nike

在按照 RailsCast 导入 CSV ( http://railscasts.com/episodes/396-importing-csv-and-excel ) 后,我正在尝试验证正在上传的文件是否为 CSV 文件。

我已使用 gem csv_validator 执行此操作,如此处所述 https://github.com/mattfordham/csv_validator

所以我的模型看起来像这样:

class Contact < ActiveRecord::Base
belongs_to :user

attr_accessor :my_csv_file
validates :my_csv_file, :csv => true

def self.to_csv(options = {})
CSV.generate(options) do |csv|
csv << column_names
all.each do |contact|
csv << contact.attributes.values_at(*column_names)
end
end
end
def self.import(file, user)
allowed_attributes = ["firstname","surname","email","user_id","created_at","updated_at", "title"]
CSV.foreach(file.path, headers: true) do |row|
contact = find_by_email_and_user_id(row["email"], user) || new
contact.user_id = user
contact.attributes = row.to_hash.select { |k,v| allowed_attributes.include? k }
contact.save!
end
end
end

但我的系统仍然允许我选择导入非 CSV 文件(例如 .xls),我收到了由此产生的错误:UTF-8 中的无效字节序列

谁能告诉我为什么以及如何解决这个问题?

请注意,我使用的是 Rails 4.2.6

最佳答案

你可以创建一个新类,比方说ContactCsvRowValidator:

class ContactCsvRowValidator

def initialize(row)
@row = row.with_indifferent_access # allows you to use either row[:a] and row['a']
@errors = []
end

def validate_fields
if @row['firstname'].blank?
@errors << 'Firstname cannot be empty'
end

# etc.
end

def errors
@errors.join('. ')
end
end

然后像这样使用它:

# contact.rb
def self.import(file, user)
allowed_attributes = ["firstname","surname","email","user_id","created_at","updated_at", "title"]
if file.path.split('.').last.to_s.downcase != 'csv'
some_method_which_handle_the_fact_the_file_is_not_csv!
end
CSV.foreach(file.path, headers: true) do |row|
row_validator = ContactCsvRowValidator.new(row)
errors = row_validator.errors
if errors.present?
some_method_to_handle_invaid_row!(row)
return
end

# other logic
end
end

可以轻松修改此模式以满足您的需要。例如,如果您需要导入多个不同的模型,您可以创建一个基础 CsvRowValidator 来提供基本方法,例如 validate_fieldsinitializeerrors。然后,您可以为您想要的每个模型创建一个继承自此 CsvRowValidator 的类,实现自己的验证。

关于ruby-on-rails - ruby rails : Validate CSV file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38856494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com