Rails form_with(远程:true)错误

时间:2018-08-29 22:11:03

标签: rspec rspec-rails ruby-on-rails-5.2

我在这里需要帮助

当我尝试使用来自Rails的ajax更新模型时出现错误(form_with / remote:true)。我能够很好地处理XHR请求的URL,这些URL是Rails的资源(请参见下面的路由),但是使用自定义URL会出错。

控制器:

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(请求):

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

视图:

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

路线:

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: { ... }

错误消息:

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

另一个请求测试

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

错误消息

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
  • 任何问题,只需提出评论即可

谢谢!

2 个答案:

答案 0 :(得分:0)

根据建议尝试在request.xhr?块之前调用respond_to  here

答案 1 :(得分:0)

问题的原因

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

ActionController::UnknownFormat消息相关的问题是由于请求的定义不正确,正如我们在日志中看到的那样:

  

通过UserController#criar作为

进行处理

句子结尾缺少类型/格式(HTML / JS / ... etc)。

该问题由两个因素引起:

  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(资源)定义的路由,将参数传递到生成路径不会引发错误ActionController::UnknownFormat

解决方案

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

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

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