Rails 4将附件上传的file_field添加到现有表单和控制器

我是铁杆的新手。 现在已经学习了几个星期。 请原谅我的愚蠢。 我无法获取我选择上传的文件。

我正在使用Rails 4.0.0。

我正在处理我的第一个应用程序,我开始关注博客应用程序的rails指南。 我接受了它,并与它一起运行,并创建了一些不同的(错误跟踪系统),只是试图学习绳索。

所以,我有我的表格:

 

我已经在我的file_field中添加了。 视图中的显示部分看起来并且在选择文件时效果很好。

   

我从导轨4指南FYI中取出了这个。 所以我的控制器看起来像这样:

 class PostsController < ApplicationController def new @post = Post.new end def create @post = Post.new(params[:post].permit(:title, :text, :user, :screen)) if @post.save redirect_to posts_path else render 'new' end end def show @post = Post.find(params[:id]) end def index @posts = Post.all end def edit @post = Post.find(params[:id]) end def update @post = Post.find(params[:id]) if @post.update(params[:post].permit(:title, :text, :user, :screen)) redirect_to posts_path else render 'edit' end end def destroy @post = Post.find(params[:id]) @post.destroy redirect_to posts_path end def upload uploaded_io = params[:post][:attachment] File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file| file.write(uploaded_io.read) end end private def post_params params.require(:post).permit(:title, :text, :user, :screen, :attachment) end end 

这里的新作品是上传。 从数据库写入/读取并显示其他所有工作正常。 显示视图时,我创建文本条目,附加文件并点击提交。 一切都写入数据库并显示在索引上,但我试图附加的文件没有写入〜/ bugs / public / uploads /

在此先感谢您的帮助。

我认为问题可能是:attachment属性不是“创建”或“更新”操作中的允许参数。

编辑:我做简单文件上传的方式是使用Paperclip gem – 这个railscast很好地解释了它。 它真的很容易使用。

还有这个答案可能会回答这个问题。

此外,使用强参数的标准方法是在私有方法中定义允许的params并在控制器操作中调用该方法(因此您不必重复自己)。 这可能是错误的原因。

例:

 def create @post = Post.new(post_params) ... end 

希望有所帮助。

我有同样的问题,

解决方案: –

删除“def upload”并将代码提供给“def create”本身

 > def create > > uploaded_io = params[:post][:attachment] > File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file| > file.write(uploaded_io.read) > end > > @post = Post.new(params[:post].permit(:title, :text, :user, :screen)) > > if @post.save > redirect_to posts_path > else > render 'new' > end > end 

确保’upload’目录存在于’public’中。

您可以通过在文件操作之前添加此行来自动处理:

Dir.mkdir 'public/uploads' unless File.directory? 'public/uploads'