Ruby on rails Rpsec“;“没有路线匹配”;
我有一个奇怪的情况。 我的routes.rb中有这样的代码:Ruby on rails Rpsec“;“没有路线匹配”;,ruby-on-rails,rspec,Ruby On Rails,Rspec,我有一个奇怪的情况。 我的routes.rb中有这样的代码: concern :votable do post :vote_up, on: :member, controller: :votes post :vote_down, on: :member, controller: :votes end resources :questions, concerns: [:commentable, :votable], shallow: true do resources :answer
concern :votable do
post :vote_up, on: :member, controller: :votes
post :vote_down, on: :member, controller: :votes
end
resources :questions, concerns: [:commentable, :votable], shallow: true do
resources :answers, concerns: [:commentable, :votable]
end
因此,它通过“post”向我提供帮助者投票表决问题和投票表决回答:
vote_up_answer POST /answers/:id/vote_up(.:format) votes#vote_up
vote_down_answer POST /answers/:id/vote_down(.:format) votes#vote_down
vote_up_question POST /questions/:id/vote_up(.:format) votes#vote_up
vote_down_question POST /questions/:id/vote_down(.:format) votes#vote_down
我的财务总监:
before_action :load_parent
def vote_up
current_user.vote_for(@parent)
redirect_to :back, notice: "Voted up"
end
private
def load_parent
resource, id = request.path.split("/")[1, 2]
@parent = resource.singularize.classify.constantize.find(id)
end
一切都很完美,但是!
我想用RSpec测试load\u parent
方法:
RSpec.describe VotesController, type: :controller do
let(:question) {create(:question)}
let(:answer) {create(:answer, user_id: user, question_id: question)}
let(:user) {create(:user)}
before(:each) do |example|
sign_in user if example.metadata[:sign_in]
request.env["HTTP_REFERER"] = question_path(question) if example.metadata[:redirect_back]
end
describe 'POST #vote_up', sign_in: true, redirect_back: true do
it 'should assign question to @parent' do
post vote_up_question_path(question)
expect(assigns(:parent)).to eq 'question'
end
end
end
这里有一个问题:
ActionController::UrlGenerationError:
No route matches {:action=>"/questions/1/vote_up", :controller=>"votes"}
怎么了?我还尝试了不同的方法来明确路线,比如post:vote\u up,question\u id:question
,但不起作用试试:
let!(:question) {create(:question)}
let!(:user) {create(:user)}
let!(:answer) {create(:answer, user_id: user, question_id: question)}
let是惰性的,所以如果在这个块中没有调用它,它可能是未定义的
然后做:
describe 'POST #vote_up', sign_in: true, redirect_back: true do
it 'should assign question to @parent' do
post :vote_up, id: question.id
expect(assigns(:parent)).to eq 'question'
end
结束你能展示一下rake routes
输出吗?在问题中添加了部分内容。你试过了吗post:vote\u up,id:question.id
?是的,结果很奇怪-ActiveRecord::RecordNotFound:找不到id=1的答案
我可以测试答案案例,但问题并非如此——因此这不是正确的解决方案。然而,我仍然不明白为什么会发生这种情况