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

时间:2013-08-23 15:53:02

标签: ruby-on-rails ruby ruby-on-rails-4 filefield

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

我正在使用Rails 4.0.0。

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

所以,我有我的表格:

<%= form_for @post do |f| %>

我在我的file_field中添加了。视图中的显示部分在选择文件时看起来很好用。

<%= f.label :attachment %>
<%= f.file_field :attachment %>

我从导轨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 /

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

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

编辑:我执行简单文件上传的方式是使用Paperclip gem - 这个railscast解释得很好。它真的很容易使用。

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

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

示例:

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

希望有所帮助。

答案 1 :(得分:2)

我遇到了同样的问题,

解决方案: -

删除“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

答案 2 :(得分:1)

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

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

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