【问题标题】:Rails 4 add file_field for attachment upload to existing form and controllerRails 4 添加 file_field 以将附件上传到现有表单和控制器
【发布时间】:2013-08-23 15:53:02
【问题描述】:

我对 Rails 很陌生。已经学了几个星期了。请原谅我的白痴。我无法获取我选择上传的文件。

我使用的是 Rails 4.0.0。

我正在开发我的第一个应用程序,我从遵循博客应用程序的 Rails 指南开始。我拿着它跑了,正在创建一些不同的东西(错误跟踪系统),只是想学习绳索。

所以,我得到了我的表格:

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

我已经在我的 file_field 中添加了。就选择文件而言,视图中的显示部分看起来和工作良好。

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

我已经从 Rails 4 指南中拉出这个,仅供参考。所以我的控制器看起来像这样:

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/

提前感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    例子:

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

    希望对您有所帮助。

    【讨论】:

    • 感谢克里斯的回复。所以,我也调查了。我添加了 :attachment 以仅创建操作,然后创建了一个新的“错误”。提交时,我得到“未知属性:附件”。那么我是否需要再次生成我的控制器并包含:附件?我没有这样做是因为我认为文件名(至少还没有)没有插入到数据库中。再说一次,我真的不知道我在说什么。我会尝试并更新我的评论。
    • 快速更新,因为我还在研究,所以我生成了一个新模型,然后运行 ​​rake db:migrate,我现在收到一个新错误(进度!),内容为:TypeError: can' t 将 ActionDispatch::Http::UploadedFile 转换为字符串:INSERT INTO "posts" ("attachment", "created_at", "screen", "text", "title", "updated_at", "user") VALUES (?, ?, ?, ?, ?, ?, ?)
    • 用几个可能的解决方案编辑了答案。
    • 我搞定了。我刚刚将上传操作的内容移到了创建操作中。我最终会使用回形针/载波,但我想从简简单的开始。 Chris C. 非常感谢您的帮助,因为它帮助我找到了答案。另外,非常感谢私下定义参数后的 (post_params)。
    • 没有问题。很高兴它有帮助。祝你学习 Rails 好运……太棒了。
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      确保“public”中存在“uploads”目录。

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

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

      【讨论】:

      • 谢谢,在公用文件夹中创建上传目录之前,我确实运行了几次。但是这样做之后仍然没有骰子。
      猜你喜欢
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多