Rspec Rails表单_有(远程:true)错误

Rspec Rails表单_有(远程:true)错误,rspec,rspec-rails,ruby-on-rails-5.2,Rspec,Rspec Rails,Ruby On Rails 5.2,我需要一些帮助 当我尝试从Rails使用ajax更新模型时,我遇到了一个错误(form_with/remote:true)。我能够很好地处理由Rails提供资源的URL的XHR请求(请参阅下面的路由),但对于自定义URL,我遇到了一个错误 控制器: rspec(请求): 视图: 正如您在test.log中所看到的,由UserController处理#criar As没有特定的格式(也许这就是问题所在?) test.log: 错误消息: 另一个请求测试 错误消息 失败/错误:预期(响应)。将\u重

我需要一些帮助

当我尝试从Rails使用ajax更新模型时,我遇到了一个错误(form_with/remote:true)。我能够很好地处理由Rails提供资源的URL的XHR请求(请参阅下面的路由),但对于自定义URL,我遇到了一个错误

控制器: rspec(请求): 视图: 正如您在test.log中所看到的,
由UserController处理#criar As
没有特定的格式(也许这就是问题所在?)

test.log: 错误消息: 另一个请求测试 错误消息
失败/错误:预期(响应)。将\u重定向到(新的\u会话\u路径)
预期响应为a,但为a
回复主体:若要继续,请登录。
意见:

  • 我已尝试将路由上的url更改为:
    put'/criar',to:'user#criar',约束:->(req){req.xhr?}
  • 如前所述,我使用
    form_中的XHR和
    对其他资源进行了相同的操作(测试、控制器),它们工作正常。这是一个自定义url无效的
  • 轨道5.2和Rspec 3.6
  • 任何问题,只需提出评论即可

提前谢谢

按照建议,在
响应
块之前,尝试调用
request.xhr?

问题的原因 嗯,经过一番探索,我找到了答案

ActionController::UnknownFormat
消息相关的问题是由于请求没有得到很好的定义,正如我发布的日志所示:

用户控制器#criar as处理

句子末尾缺少类型/格式(HTML/JS/…等)

这个问题是由两个因素引起的:
  • 使用Rspec上rails生成的路径并向其传递参数:
  • user\u criar\u path(1)
    put user\u criar\u path(user),xhr:true,参数:{…}

  • 定义我自己的路线(routes.rb)
  • get'/user/new',to:'user#new'#定义我自己的路线

    而不是

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

    观察:对于Rails(参考资料)定义的路由,将参数传递到生成的路径不会引发错误
    ActionController::UnknownFormat

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


    谢谢你的帮助,我找到并发布了解决方案!
    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
    
    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
    
    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 user_criar_path, params: { "user" => { "id" => 1 } }
    
    put user_criar_path, xhr: true, :params => { ... }