提交时清空file_field:缺少param或值为空

时间:2014-11-06 19:08:54

标签: ruby-on-rails validation ruby-on-rails-4 file-upload dragonfly-gem

我有一个应用 with dragonfly 来管理我的图片上传:

  • ruby​​ 2.1.3
  • rails 4.1.6

上传有效,但在更新操作时,文件为空时,我有以下消息:

  

ActionController :: UsersController中的ParameterMissing#update_avatar

     

param丢失或值为空:user

因为我在提交时没有传递任何参数,所以它会产生感觉。但验证呢?

型号:

class User < ActiveRecord::Base
  dragonfly_accessor :avatar

  ...

  validates_presence_of :avatar

  ...

控制器:

class UsersController < ApplicationController
  ...

  def update_avatar
    @user = User.find_by(id: current_user.id)
    respond_to do |format|
      if @user.update(user_params)
        format.html { redirect_to edit_user_avatar_url, notice: t('flash.actions.update_avatar.notice') }
        format.json { render :show, status: :ok, location: @user }
       else
         format.html { render :edit }
         format.json { render json: @user.errors, status: :unprocessable_entity }
       end
     end
   end

   ...

   def user_params
     params.require(:user).permit(:username, :name, :avatar, :birth)
   end
end

查看:

- case params[:action]

...

- when 'edit_avatar', 'update_avatar'
  = form_for @user, url: { action: 'update_avatar'} do |f|
    ul.list-form
      li.item-form 
        = f.label :avatar
          span.label-title
            ' Foto:
          = f.file_field :avatar

    .submit-area
      = button_tag "<span class='wrapper'>Update Avatar</span>".html_safe, class: 'bt'

...

我做错了什么?验证似乎无效。

更新

我通过hidden_​​field传递了 id 参数(我不喜欢这个解决方案......)并解决了这个问题。

但验证仍无效。

= hidden_field(:user, :id)

2 个答案:

答案 0 :(得分:0)

尝试在更新操作中使用此代码:

@user = User.find(params[:id])

答案 1 :(得分:0)

所以这是你的问题的答案,我知道这个答案有点太迟了,但也许其他人会发现它有用。我遇到了同样的问题。

https://github.com/rails/rails/issues/17947

简而言之,如果file_field为空,则表单不会提交该文件的任何参数。你会在上面的链接上找到两个答案如何解决你的问题。使用hiden_field_tag或使用params.fetch(:user, {})