簡體   English   中英

路由到嵌套軌道

[英]routing to nested rails route

我正在嘗試創建一個rspec來路由到嵌套資源,但是我一直收到“ No route matches錯誤。

1) V1::DevicesController scan submitted to #create
     Failure/Error: post "/v1/devices/#{device.serial_number}/scans.json", params: { data: scan }

     ActionController::UrlGenerationError:
       No route matches {:action=>"/v1/devices/7929e287466c493ba03947c189cadc81/scans.json", :controller=>"v1/devices", :data=>#<Rack::Test::UploadedFile:0x00556f7c423808 @content_type="application/gzip", @original_filename="sample_test.gz", @tempfile=#<Tempfile:/tmp/sample_test.gz20170719-65-sdfczl>>}

我的規范現在很簡單:

需要'rails_helper'

RSpec.describe V1::DevicesController, type: :controller do
  it "scan submitted to #create" do
    company = Company.create(name: "Test Company", domain: "testcompany.com")
    device = Device.create(name: "Test Device", company_id: company.id)
    scan = fixture_file_upload( "#{Rails.root}/spec/assets/sample_test.gz", 'application/gzip')
    post "/v1/devices/#{device.serial_number}/scans.json", params: { data: scan }
    expect(response).to be_successful
  end    
end

我的控制器也是相對基本的:

class V1::ScansController < ApplicationController
  skip_before_action :authenticate_user_from_token!, only: [:create]
  skip_before_action :authenticate_user!, only: [:create]
  skip_before_filter :verify_authenticity_token, :if => Proc.new { |c| c.request.format == 'application/json' }, only: [:create]

  def create
    @scan = Scan.new(scan_params)

    respond_to do |format|
      if @scan.save
        # GenerateReport.perform_async(@scan.id)
        format.json { render json: @scan, status: :created }
      else
        format.json { render json: @scan.errors, status: :unprocessable_entity }
      end
    end

  end


  private

  def set_device
    @device = Device.find_by!(serial_number: params[:device_serial_number])
  end

  def scan_params
    params.require(:scan).permit(:device_serial_number, :data)
  end

end

我的路線文件具有:

api_version(:module => "V1", :path => {:value => "v1"}) do
  resources :devices, only: [:show, :update], param: :serial_number do
    resources :scans, only: [:create]
  end
end

產生以下路線:

v1_device_scans POST   /v1/devices/:device_serial_number/scans(.:format) v1/scans#create

所以,很明顯我的路線在那里...我想念什么?

使用的馬修和Gerry的思想的混合物,我能闖過no route問題有:

post :create, params: { device_serial_number: device.serial_number, scan: { data: scan } }

由於我的控制器具有此方法,因此最終需要將其他屬性嵌套在params哈希中:

  def scan_params
    params.require(:scan).permit(:device_serial_number, :data)
  end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM