【问题标题】:Rails 4 ActionController::UnknownFormat error in Update method更新方法中的 Rails 4 ActionController::UnknownFormat 错误
【发布时间】:2014-07-22 20:00:42
【问题描述】:

我在调用 Update 方法时收到以下错误。

ActionController::UnknownFormat (ActionController::UnknownFormat):
  app/controllers/devise/custom/registrations_controller.rb:21:in `update_avatar'

这是有问题的控制器:

class Devise::Custom::RegistrationsController < Devise::RegistrationsController

  respond_to :html, :js

  def update_avatar
    @user = current_user

    if @user.update(user_params)
      respond_to do |format|
        format.js { render 'update_avatar'}
        flash[:notice] = "Updated user"
      end
    else
      render 'edit'
    end
  end

  protected
    def user_params
     params.require(:user).permit(:avatar)
    end
end

奇怪的是,我在其他控制器上使用这种方法没有任何问题,但在这里它落在了 respond_to 线上。

谁能解释一下?谢谢!

日志

由 Devise::Custom::RegistrationsController#update_avatar 处理为 参数:{"utf8"=>"✓", "remotipart_submitted"=>"true", "authenticity_token"=>"reTaOwTtvbI+IPYq1nvLWl0blVOmaSu/o5VpfGziguo=", "X-Requested-With"=>"IFrame", "X-Http-Accept"=>"text/javascript, 应用程序/javascript,应用程序/ecmascript, 应用程序/x-ecmascript, /; q=0.01", "用户"=>{"头像"=>#, @original_filename="translate.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"user[avatar]\"; filename=\"translate.jpg\"\r\nContent-Type: image/jpeg\r\n">}}

【问题讨论】:

  • 您可以查看您的日志并添加处理该操作的前几行输出吗?它应该类似于我的日志Processing LessonsController#online_xml [GET]\n Parameters: {"id"=&gt;"57978"} 中的这个示例
  • 谢谢,我已经安装了。它正在上传文件并保存到数据库,只是不处理 format.js 来调用我的 ajax 请求。
  • 也许由于某种原因它被作为 html 请求处理?尝试添加format.html { raise 'We got an HTML request'}
  • 嗯,不——也不这样做。我在想可能与它是自定义设计控制器这一事实有关?虽然看不出它对这个有什么影响......

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


【解决方案1】:

我认为您的错误是由于 render 'edit' 这一行造成的。您在使用 respond_to 时应该指定 format

更新你的 update_avatar 方法来喜欢这个

def update_avatar
  @user = current_user

  if @user.update(user_params)
    respond_to do |format|
      format.js { render 'update_avatar'}
      flash[:notice] = "Updated user"
    end
  else
    format.html { render 'edit' } # here
  end
end

【讨论】:

【解决方案2】:

对我来说,答案是完全重写自定义控制器。我遵循了本指南:http://natashatherobot.com/devise-rails-sign-in/ 并相应地重构了我的代码。在处理此类问题之前,它还有助于更多地了解 Devise!

感谢所有的贡献。网络上获得帮助的最佳地点,放下手!

【讨论】:

    【解决方案3】:

    我觉得你应该试试:

    format.js { render 'update_avatar',
            flash[:notice] = "Updated user"}
    

    顺便说一句,deyan 是对的! format.js renders renders update_avatar.js 默认不需要指定。

    【讨论】:

      【解决方案4】:

      不需要format.js { render 'update_avatar'} 中的{ render 'update_avatar'} 部分,因为它会默认尝试加载名为update_avatar.js 的文件。

      你真的有这样的js文件吗?

      您也可以使用类似 format.js {render "alert('Hello World');"} 的内容进行测试,看看它是否正常工作。

      【讨论】:

      • 谢谢,是的,我愿意 - 通常如果文件不存在,我会看到不同的错误。它不会像这里那样在 respond_to 线上失败。它没有到达 format.js 行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多