设计注册控制器的ActionController :: UrlGenerationError

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计注册控制器的ActionController :: UrlGenerationError相关的知识,希望对你有一定的参考价值。

我在测试我的自定义设计ActionController::UrlGenerationError时遇到了一个有趣的User::RegistrationsController

这是错误:

 ActionController::UrlGenerationError:
   No route matches {:action=>"create", :controller=>"user/registrations", :user=>{:name=>"Adriane Koepp", :city=>"Nidiafurt", :address=>"14955 Cormier Viaduct", :country=>"Mozambique", :email=>"moshe@kozey.com", :phone_primary=>"(295) 491-0447 x9108", :phone_secondary=>"536.985.9499 x7264", :postal_code=>"93438-7448", :province=>"South Carolina", :password=>"MaH9R5G8XqB", :pets_attributes=>[{:name=>"Patches", :chip_number=>"149793073311890", :species=>"iusto"}]}}

该错误出现在我对该控制器的所有测试中,但为简单起见,我将仅列出create操作的一个测试:

it 'creates a new User' do
  expect do
    post :create, params: { user: valid_attributes }
  end.to change(User, :count).by(1)
end

routes.rb包含:

devise_for :users, controllers: {
  registration: 'user/registration'
}

我可以在http://localhost:3000/users/sign_up上导航到我的注册页面,但由于某种原因,我的测试似乎并不认为这个控制器有一个有效的create动作的URL。为什么这样?

其他步骤

在遵循D1ceWard的建议后,我在我的路线中复制了“注册”,现在错误消息更改为AbstractController::ActionNotFound错误。我通过跟随documentation反击并将以下块添加到我的测试顶部:

before(:each) do
  @request.env['devise.mapping'] = Devise.mappings[:user]
end
答案

你的错误是由于缺少多元化引起的,devise不知道registration是什么,但与registrations合作。

方案:

# routes.rb
devise_for :users, controllers: {
  registrations: 'user/registrations'
}

您可以使用rails routes检查所有现有路线。

Devise doc about custom controllers

以上是关于设计注册控制器的ActionController :: UrlGenerationError的主要内容,如果未能解决你的问题,请参考以下文章

设计中的 ActionController::UrlGenerationError::Registrations#create

测试一个包含 ActionController::Live 的控制器

覆盖设计after_sign_up_path_for不起作用

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):将 JSON 参数发布到

ActionController::InvalidAuthenticityToken Rails 5 / 设计 / 审核 / PaperTrail gem

Rails 6 - 常量 ActionController::InvalidAuthenticityToken