7

我对 ROR 很陌生。我有一个任务要完成:

这是模型:

class File::DataImport < ActiveRecord::Base
  attr_accessible :created_by, :file_name, :file_source, :updated_at, :updated_by
end

这是控制器:

class Files::DataImportsController < ApplicationController
  def index
  end

  def new
  end
end

我的观点是indexnew

我想要一个字段来上传数据。数据应存储在服务器中,并将文件路径保存到数据库中的指定列file_name中。该路径应该是所有上传文件的默认路径。

我不知道如何开始。请帮助我找到解决方案,我将从中学习。

提前致谢。

4

3 回答 3

9

db/migrate/20110711000004_create_files.rb

class CreateFiles < ActiveRecord::Migration
def change
  create_table :files do |t|
  t.string :name
  # If using MySQL, blobs default to 64k, so we have to give
  # an explicit size to extend them
  t.binary :data, :limit => 1.megabyte
  end
end
end

应用程序/控制器/upload_controller.rb

 class UploadController < ApplicationController
 def get
 @file = File.new
 end
 end

应用程序/视图/上传/get.html.erb

<% form_for(:file,
url: {action: 'save'},
html: {multipart: true}) do |form| %>
Upload your file: <%= form.file_field("uploaded_file") %><br/>
<%= submit_tag("Upload file") %>
<% end %>

应用程序/模型/file.rb

class File < ActiveRecord::Base
def uploaded_file=(file_field)
self.name = base_part_of(file_field.original_filename)
self.data = file_field.read
end
def base_part_of(file_name)
File.basename(file_name).gsub(/[^\w._-]/, '')
end
end

应用程序/控制器/upload_controller.rb

def save
@file = File.new(params[:file])
if @file.save
redirect_to(action: 'show', id: @file.id)
else
render(action: :get)
end
end

应用程序/控制器/upload_controller.rb

def file
@file = File.find(params[:id])
send_data(@File.data,
filename: @File.name,
disposition: "inline")
end

应用程序/控制器/upload_controller.rb

def show
@file = File.find(params[:id])
end

应用程序/视图/上传/show.html.erb

<h3><%= @file.name %></h3>
<img src="<%= url_for(:action => 'file', :id => @file.id) %>"/>
于 2012-09-19T07:17:04.957 回答
1

您应该考虑使用一种已经可用的解决方案,例如回形针:https : //github.com/thoughtbot/paperclip 或carrierwave:https ://github.com/jnicklas/carrierwave

除了自述文件之外,还有很好的教程:

http://railscasts.com/episodes/134-paperclip

http://railscasts.com/episodes/253-carrierwave-file-uploads

编辑:由于您想自己实现它,我建议您在 Github 上检查上述源代码,并尝试了解他们的代码在做什么。我也不会费心自己实现它,但如果你有你的理由,这可能会让你继续......

于 2012-09-18T21:00:01.473 回答
0

您可能需要研究诸如carrierwave之类的解决方案。

Github 页面对如何使用它提供了很好的解释,但这也是一个很好的指南。

于 2012-09-18T20:59:02.230 回答