【问题标题】:RSpec No route matches for destroy methodRSpec没有与destroy方法匹配的路由
【发布时间】:2019-01-15 15:05:16
【问题描述】:

我正在尝试为我的应用测试创建方法,但出现以下错误:

1) RanksController POST #create when user is sign in creates rank
   Failure/Error: post :create, params: { user: user, movie: movie }

ActionController::UrlGenerationError:
No route matches {:action=>"create", :controller=>"ranks", :movie=>#<Movie 
id: 1, title: "excepturi", description: "Vilicus crur volutabrum balbus cum 
vulgaris statua...", released_at: "1998-03-22 00:00:00", avatar: nil, 
genre_id: 1, created_at: "2019-01-15 14:45:10", updated_at: "2019-01-15 
14:45:10">, :user=>#<User id: 1, email: "deja@ruel.co", created_at: "2019- 
01-15 14:45:10", updated_at: "2019-01-15 14:45:10", phone_number: name: "">}

我找到了很多潜在的解决方案,但它们对我不起作用。

ranks_controller_spec

RSpec.describe RanksController, type: :controller do
  let(:user) { FactoryBot.create(:user) }
  let(:movie) { FactoryBot.create(:movie) }

  describe "POST #create" do
    context "when user is sign in" do
      before { sign_in(user) }

      it "creates rank" do
        expect do
          post :create, params: { user: user, movie: movie }
        end.to change(Rank, :count).by(1)
        expect(response).to have_http_status(:redirect)
      end
    end
  end

ranks_controller

  class RanksController < ApplicationController
       before_action :set_movie, only: %i[create destroy]

       def create
         Rank.create!(user: current_user, movie: @movie)

         redirect_to @movie
       end

       def destroy
         rank = @movie.ranks.find(params[:id])
         rank.destroy!

         redirect_to @movie
       end

       private

       def set_movie
         @movie = Movie.find(params[:movie_id])
       end
     end

show.html.haml

  - if @rank
       = link_to 'Vote', movie_rank_path(@movie, @rank), method: :delete
     - else
       = link_to 'Vote', movie_ranks_path(@movie), method: :post

在 movies_controller.rb 中显示动作:

  def show
    @movie = Movie.find(params[:id])
    @like = @movie.likes.find_by(user: current_user)
  end

routes.rb

 resources :movies, only: [:index, :show] do
   resources :ranks, only: %i[create destroy]
   member do
     get :send_info
   end
   collection do
     get :export
   end
 end

在网页版中,一切都按预期工作

【问题讨论】:

    标签: rspec ruby-on-rails-5


    【解决方案1】:

    尝试传递 id 而不是像下面这样的对象

    post :create, params: { user_id: user.id, movie_id: movie.id }
    

    我认为您根本不需要传递useruser_id,因为您没有在创建操作中使用它。 current_user 创建操作应返回您在 before 块上登录的用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 2011-05-06
      • 2011-04-14
      • 2019-05-25
      • 2017-04-02
      • 2018-03-04
      • 1970-01-01
      相关资源
      最近更新 更多