【发布时间】:2016-12-15 20:08:47
【问题描述】:
按照 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),我收到错误消息:invalid byte sequence in UTF-8。
谁能告诉我为什么以及如何解决这个问题?
请注意,我使用的是 Rails 4.2.6
【问题讨论】:
-
您可以在尝试导入文件之前检查文件的扩展名:
file.path.split('.').last.to_s.downcase == 'csv' -
@MrYoshiji 感谢您的评论,不过我也想验证某些列中的数据,这个 gem(应该)允许我这样做
-
此 gem 允许您检索列中的数据,您负责制定逻辑以“验证列中的数据”。如果您想要一些关于从哪里开始的提示,我可以发布答案
-
好的,能不能请您回复一下
标签: ruby-on-rails ruby excel csv ruby-on-rails-4