Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中上载文件_Ruby On Rails_Ruby_File Upload_File Io - Fatal编程技术网

Ruby on rails 在Rails中上载文件

Ruby on rails 在Rails中上载文件,ruby-on-rails,ruby,file-upload,file-io,Ruby On Rails,Ruby,File Upload,File Io,我是rails新手,我正在使用CRUD技术编写一个RESTful网站。到目前为止,我已经创建了三个页面,所有这些页面都允许用户从数据库中创建、编辑和删除一行。然而,我的第四页需要包含一个上传文件表单,但是a)我不知道文件系统如何与Rails一起工作,因此我不知道文件应该存储在哪里。该文件大约为100kb,无法存储在临时存储器中,因为它将不断下载。b)我不知道如何写入文件 如果您能告诉我如何执行上面提到的操作,那就太好了——在输入表单上创建上载输入,然后将文件写入单独目录中的文件路径。有一个很好的

我是rails新手,我正在使用CRUD技术编写一个RESTful网站。到目前为止,我已经创建了三个页面,所有这些页面都允许用户从数据库中创建、编辑和删除一行。然而,我的第四页需要包含一个上传文件表单,但是a)我不知道文件系统如何与Rails一起工作,因此我不知道文件应该存储在哪里。该文件大约为100kb,无法存储在临时存储器中,因为它将不断下载。b)我不知道如何写入文件


如果您能告诉我如何执行上面提到的操作,那就太好了——在输入表单上创建上载输入,然后将文件写入单独目录中的文件路径。

有一个很好的gem,专门用于上载文件:。如果维基没有帮助,那么有一个关于使用它的最佳方式的问题。总之,Rails表单中有一个字段类型
file
,它调用文件上传对话框。您可以使用它,但“魔法”是由
carrierwave
gem完成的


我不知道“如何写入文件”是什么意思,但我希望这是一个好的开始

2018年更新

虽然下面所写的一切都是正确的,但Rails 5.2现在包含了
活动存储
,它允许直接上传到S3(或其他云存储服务)、图像转换等内容。您应该查看并自行决定适合您需要的内容


虽然有很多gem可以很好地解决文件上传问题(请参阅列表),但是rails有内置的助手,可以轻松地推出自己的解决方案

在表单中使用
文件\u字段
-表单帮助器,rails为您处理上传:

<%= form_for @person do |f| %>
  <%= f.file_field :picture %>
<% end %>

这取决于您想要实现的目标的复杂性,但这对于简单的文件上传/下载任务来说已经足够了。此示例取自rails指南,您可以到那里了解更多信息:

2018年9月

对于最近检查此问题的任何人

因为它是核心轨道5.2 +现在的一部分,它是很好的集成的,并且有很好的性能(仍然是所有其他著名的宝石,如CaveRew,神龛,纸夹,……很棒,但是这一个提供了非常好的特性,我们可以考虑任何新的Rails项目)

回形针团队不推荐gem,而支持Rails ActiveStorage

&到处都有大量可用的资源


非常有助于理解Activestorage的功能

好的。如果您不想将文件存储在数据库中并存储在应用程序中,如资产(自定义文件夹),则可以定义由attr\u accessor:document定义的非db实例变量,并使用
form\u for-f.file\u字段
获取文件

在控制器中

 @person = Person.new(person_params)
此处
person\u params
返回白名单
params[:person]
(定义您自己)

将文件另存为

dir = "#{Rails.root}/app/assets/custom_path"
FileUtils.mkdir(dir) unless File.directory? dir
document = @person.document.document_file_name # check document uploaded params
File.copy_stream(@font.document, "#{dir}/#{document}")
注意,将此路径添加到
.gitignore
&如果要再次使用此文件,请通过
application.rb将此路径添加到应用程序的
asset\u路径

每当窗体读取文件字段时,它都会存储在tmp文件夹中,以后可以存储在您的位置,我给出了存储在资产的示例


注意:这样存储文件会增加应用程序的大小,最好使用Intializer/carrierwave.rb中的
回形针
存储在数据库中

if Rails.env.development? || Rails.env.test?
    config.storage = :file
    config.root = "#{Rails.root}/public"
    if Rails.env.test?
      CarrierWave.configure do |config|
        config.storage = :file
        config.enable_processing = false
      end
    end
 end

在本地运行时,使用此选项存储在文件中

我明白了,因此您可以使用tis gem。不过,我不想将文件写入数据库,只是文件路径,您提供的代码不会将其写入活动记录吗?不,实际上,代码只将其写入文件系统,而根本不会写入数据库。事实上,您仍然需要以某种方式将文件与数据库记录相关联(例如,通过将上载文件的文件名设置为记录的id)。您可以查阅ruby文档以了解有关
文件的更多信息。打开
()。请编辑代码以使用
wb
,而不是仅使用
w
,否则对于具有非ascii字符的文件,上载可能会失败。
新的
控制器方法中有什么内容?@KarolSelak此示例仅提供了简单文件上载的概述,您可以在rails指南(/)中了解有关布线和表单的更多信息
if Rails.env.development? || Rails.env.test?
    config.storage = :file
    config.root = "#{Rails.root}/public"
    if Rails.env.test?
      CarrierWave.configure do |config|
        config.storage = :file
        config.enable_processing = false
      end
    end
 end