以下两种form都可以上载文件(http://guides.rails.info/form_helpers.html#what-gets-uploaded)
第一种
<%= form_tag({:action => :upload}, :multipart => true) do %>
<%= file_field_tag 'picture' %>
<% end %>
第二种
<%= form_for @person do |f| %>
<%= f.file_field :picture %>
<% end %>
controller中
def upload
uploaded_io = params[:person][:picture]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file|
file.write(uploaded_io.read)
end
end
实例:
涉及到xls读入并创建记录
view中
<%= form_for(@part, :url => {:action => "upload"}) do |f| %>
<%= f.file_field :xls_file%>
<%= f.submit %>
<% end %
controller中
def upload
begin
if params[:part][:xls_file]
uploaded_io = params[:part][:xls_file]
workbook = Spreadsheet.open(uploaded_io.tempfile)
sheet = workbook.worksheet 0
Part.transaction do
sheet.each do |row|
if row[0].is_a?(Float)
part = Part.create!(:name=>row[1], :project_id => params[:part][:project_id], :size=>row[3], :material=>row[4], :quantity=>row[5].to_i, :weight=>row[6], :description=>row[8])
end
end
redirect_to ......
end
else
raise Errno::error #在没有选择导入文件直接点击上载时抛出一个异常
end
rescue => err
logger.error(err)
redirect_to ......
end
end
对上述controller中的处理增加出错提示、方便使用者定位自己的导入文件的错误
def upload
part = Part.new
begin
if params[:part][:xls_file]
uploaded_io = params[:part][:xls_file]
workbook = Spreadsheet.open(uploaded_io.tempfile)
sheet = workbook.worksheet 0
error_location = 0 #记录出错位置
Part.transaction do
sheet.each do |row|
error_location += 1
if row[7].is_a?(Float)
chart = Chart.find_or_create_by_name(row[1])
category = Category.find_by_name(row[2])
part = Part.new(
:project_id => params[:part][:project_id],
:number => row[0],
:chart_id => chart.id,
:category_id => category.id,
:name => row[3],
:quantity => row[6].to_i,
:weight => row[7].to_f,
:description => row[9])
unless part.valid?
raise part.errors.full_messages
else
part.save
end
end
end
redirect_to parts_path(:project_id => params[:part][:project_id]), :notice => I18n.t("flash.parts.upload_success.notice")
end
else
raise "import empty!"
end
rescue => err
#将出错信息记录到log中
logger.error("#{error_location} row Error!")
logger.error(part.errors.full_messages)
logger.error(err)
#将错误信息显示到页面
if part.errors.blank?
error_message = "没有选择导入文件!"
else
error_message = "导入失败!第#{error_location}行出错:" + part.errors.full_messages.to_s
end
redirect_to :back, :notice => error_message
end
end
The Spreadsheet Library:http://spreadsheet.rubyforge.org/GUIDE_txt.html
分享到:
相关推荐
NULL 博文链接:https://mylir.iteye.com/blog/800734
NULL 博文链接:https://dendrobium.iteye.com/blog/305938
jquery-fileupload-rails, 用于 Rails的jQuery文件上传集成 Rails 文件上传jQuery-File-Plugin 是一个文件上传插件,由的Tschan 。 jQuery文件上传功能多文件选择。drag&拖放支持。进度栏和jQuery预览图像。 支持...
可实现多文件的同时上传,控制文件的格式,数量,同时兼容IE6,7,firefox,易于扩展
NULL 博文链接:https://zyn-zyn.iteye.com/blog/1163143
这个简单的插件使您能够调用to_xls到Rails的数组集合。 数组元素支持对象:ActiveRecord,Mongid,哈希。 在您的Gemfile中: gem 'to_xls-rails' # Last officially released gem # gem "to_xls-rails", :git => ...
css和图片 博文链接:https://hideto.iteye.com/blog/197517
Paperclip 是 Rails 框架的一个插件,用于扩展 ActiveRecord 以支持简单的文件附件的功能。 标签:Paperclip
安装在Gemfile中: gem 'rails-uploader'在航线上: mount Uploader :: Engine => '/uploader' 迁移ActiveRecord: $ bundle exec rails g uploader:install用法存储上传文件的架构(cancan集成): class Asset <...
rails_layout, 为各种前端框架生成 Rails 应用程序布局文件 RailsLayout gem使用这里 gem 可以设置你选择的前端框架的布局文件:Zurb基础 5.3Bootstrap 4.0Bootstrap 3.3它还将为 Bootstrap 或者基础设置设计视图。...
博文链接:https://agi-alvin.iteye.com/blog/77580
rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails ...
Ruby-LockboxRuby和Rails的文件加密
[Pragmatic Bookshelf] Crafting Rails Applications Expert Practices for Everyday Rails Development (E-Book) ☆ 图书概要:☆ Rails 3 is a huge step forward. You can now easily extend the framework, ...
Ruby on Rails Guides v2 - Ruby on Rails 4.2.5
《Ruby on Rails Tutorial》中文版(原书第2版,涵盖 Rails 4) Ruby 是一门很美的计算机语言,其设计原则就是“让编程人员快乐”。David Heinemeier Hansson 就是看重了这一点,才在开发 Rails 框架时选择了 Ruby...
NULL 博文链接:https://hlee.iteye.com/blog/747070