Rails form_with(remote:true)错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails form_with(remote:true)错误相关的知识,希望对你有一定的参考价值。

我需要一些帮助,

当我尝试使用Rails中的ajax(form_with / remote:true)更新模型时,我收到错误。我能够正常使用XHR请求作为Rails资源的URL(请参阅下面的路由),但是使用自定义URL我收到错误。

controller:

def criar
  @user = current_user
  respond_to do |format|
    if @user.update_attributes(user_params)
      format.js {
        flash[:success] = "Success!"
        redirect_to root_path
      }
    else
      format.js 
    end
  end
end

rspec (request):

put user_criar_path(user), xhr: true,
 :params => { ... }

view:

<%= form_with model: @user, url: user_criar_path(@user), method: :put do |f| %>

routes:

namespace :any do
  namespace :things do
    put '/criar', to: 'user#criar'         # problem with XHR
    put '/atualizar', to: 'user#atualizar' # problem with XHR
  end
end

resources :anything   # this one works fine with XHR

正如你在test.log中看到的那样,Processing by UserController#criar as没有特定的格式(也许这就是问题?)。

test.log:

Processing by UserController#criar as 
  Parameters: { ... }

error message:

Failure/Error:
  respond_to do |format|
    if @user.update_attributes(user_params)
      format.js {
        flash[:success] = "Success!"
        redirect_to root_path
      }
    else
      format.js 
    end

ActionController::UnknownFormat:
ActionController::UnknownFormat

Another request test

it "should be redirect to (criar)" do
  put user_criar_path(1), xhr: true
  expect(response).to redirect_to(new_session_path)
  expect(request.flash_hash.alert).to eq "To continue, please, sign in."
end

Error message

Failure/Error: expect(response).to redirect_to(new_session_path)
  Expected response to be a <3XX: redirect>, but was a <401: Unauthorized>
  Response body: To continue, please, sign in.

观察:

  • 我已经尝试将路线上的网址更改为:put '/criar', to: 'user#criar', constraints: -> (req) { req.xhr? }
  • 正如我之前所说,我使用form_with的XHR对其他资源做同样的事情(测试,控制器)并且它们工作正常。这个与自定义网址无法正常工作。
  • Rails 5.2和Rspec 3.6
  • 任何问题,只需询问评论

提前致谢!

答案

尝试在request.xhr?区块之前调用respond_to,正如建议的here

另一答案

Reason of the problem

好吧,经过一番搜索,我找到了答案。

ActionController::UnknownFormat消息相关的问题是由于请求没有很好地定义,因为我们可以在我发布的日志中看到:

由UserController#criar处理

它在句子末尾缺少类型/格式(html / JS / ...等)。

The problem was raised by two factors:

  1. 在Rspec上使用rails中的生成路径并将参数传递给它:

user_criar_path(1)put user_criar_path(user), xhr: true, params: {...}

  1. 定义我自己的路线(routes.rb)

get '/user/new', to: 'user#new' # defining my own route

代替

resources: user, only: [:new]#由Rails定义

观察:对于由Rails(资源)定义的路由,将参数传递给generated-path不会引发错误ActionController::UnknownFormat

Solution

从生成的路径中删除参数(对于Rspec和Rails):

put user_criar_path, params: { "user" => { "id" => 1 } }

要么

put user_criar_path, xhr: true, :params => { ... }

以上是关于Rails form_with(remote:true)错误的主要内容,如果未能解决你的问题,请参考以下文章

Rails 6.1 将 submit_tag 链接到 form_with

rails form_with 中关联模型的路径问题

form_with未提交为AJAX

用户必须存在于Rails 5中

Rails - 在选项卡之间同步按钮点击

Rails 3 原型渲染:更新响应具有 text/html 内容类型