Ruby on rails ActionController::UrlGenerationError:没有与自定义路由匹配的路由

Ruby on rails ActionController::UrlGenerationError:没有与自定义路由匹配的路由,ruby-on-rails,ruby,ruby-on-rails-4,rspec,routing,Ruby On Rails,Ruby,Ruby On Rails 4,Rspec,Routing,因此,我创建了一个小型模型/控制器来处理我的应用程序中的令牌,并使用自定义路由。然而,当我运行测试(rspec)时,我会遇到一个失败 相关代码 控制器 读取令牌(在别处生成) 耙路产生 型号 包含此项以显示令牌在创建链接时使用的是uuid,而不是id class Token < ActiveRecord::Base def to_param uuid end end 错误消息 我试过的 嗯……差不多都是 我尽我所能写下了路线 我将:uuid更改为:id,认为这可

因此,我创建了一个小型模型/控制器来处理我的应用程序中的令牌,并使用自定义路由。然而,当我运行测试(rspec)时,我会遇到一个失败

相关代码 控制器

读取令牌(在别处生成)

耙路产生

型号

包含此项以显示令牌在创建链接时使用的是uuid,而不是id

class Token < ActiveRecord::Base
  def to_param
    uuid
  end    
end
错误消息 我试过的 嗯……差不多都是

  • 我尽我所能写下了路线
  • 我将
    :uuid
    更改为
    :id
    ,认为这可能是问题所在
  • 我尝试以不同的方式指定属性,但没有成功
  • 我尝试了stackoverflow上类似问题的所有解决方案

我对测试不是很有经验(今年应该会改变);希望您可以看到通过后端而不是路由设置
uuid
的好处。

您可以通过添加
使用路由::控制器名称来实现这一点

get :index, uuid: "12345", use_route: :tokens
但是,我得到这个错误是混乱和代码气味

最终解决方案 但是,更好的解决方案是使用适当的rails路由资源()


现在它开始工作了;仍然使用相同的路径

我认为这里有些混乱。我没有设置令牌,我正在读取它。令牌在后端设置为(当前为
SecureRandom.urlsafe\u base64.to\u s
,但我将研究
has\u secure\u token
):索引控制器只读取令牌。上面的代码非常精简,以显示rspec控制器错误,而不是令牌功能好吧,我误解了你的推理等。仍然不能否认你的模式不太好。模式是路由的编写方式还是rspec测试?什么是错误的模式?模式就是解决方案的效率
token_action GET    /ta/:uuid(.:format)    tokens#read_token {:param=>:uuid}
class Token < ActiveRecord::Base
  def to_param
    uuid
  end    
end
require 'rails_helper'

RSpec.describe TokensController, type: :controller do
  describe "#index" do
    it "test" do
      get :read_token, uuid: "12345" #12345 is obviously not real
      expect(response).to redirect_to(root_path)
    end
  end
end
ActionController::UrlGenerationError: 
    No route matches` {:action=>"read_token", :controller=>"tokens", :uuid=>"12345"}
#config/routes.rb
resources :tokens, path: "token", only: [:create] #-> POST url.com/token

#app/controllers/tokens_controller.rb
class TokensController < ApplicationController
   def create
      @token = Token.create
      redirect_to root_url if @token
   end
end

#app/models/token.rb
class Token < ActiveRecord::Base
   has_secure_token :uuid
end
require 'rails_helper'

RSpec.describe TokensController, type: :controller do
  describe "#create" do
    it "has_token" do
      post :create, use_route: :tokens
      assigns(:token).should_not be_nil
      expect(response).to redirect_to(root_path)
    end
  end
end
get :index, uuid: "12345", use_route: :tokens
resource :vendor_registration, only: [], path: '/' do
  get :read_token, on: :member, path: '/ta/:uuid'
end