I have a strange situation. I have this code on my .rb routes:
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
So it gives me helpers vote_up_question and vote_up_answer via '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
My voice_controller:
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
Everything works fine, BUT! I want to verify that the load_parent method with RSpec:
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
And here is the problem:
ActionController::UrlGenerationError: No route matches {:action=>"/questions/1/vote_up", :controller=>"votes"}
What's wrong? I also tried different ways to make a clear route, like post :vote_up, question_id: question , but it does not work.