2017-07-19 2 views
0

Ich versuche, eine RSPEC zu einer verschachtelten Ressource zu routen, aber ich bekomme immer eine No route matches Fehler.Routing zu verschachtelten Schienen Route

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>>} 

Meine spec ist jetzt ganz einfach:

require '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 

Mein Controller ist relativ einfach, wie gut:

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 

und meine Routen-Datei hat:

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

, die die folgende Route ergibt:

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

So gibt, klar mein Weg ist ... was bin ich dabei?

+0

das Problem kommt fron 'post "/ v1/devices/# {} device.serial_number /scans.json",' Sie geben benötigen sie ein Symbol abgebildet Route. –

+0

was meinst du? etwas wie 'post: create, params: {device_serial_number: device.serial_number}' – Godzilla74

+0

@ MathewP.Jones es scheint, die URL zu bauen, wie ich die 'device.serial_number' tatsächlich tatsächlich in die Zeichenfolge gesetzt habe. – Godzilla74

Antwort

1

eine Mischung von Mathew und Gerry Mit Ideen ich in der Lage war vorbei no route Problem zu erhalten mit:

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

Da mein Controller diese Methode hat, beenden ich die zusätzlichen Attribute im params Hash Nest benötigen up :

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

Großartig! Ich denke, wir haben zwei Arten von Params gemischt, wir brauchen diese 'device_serial_number', um die richtige Action zu erreichen, dann brauchen wir' data', um sie zur Aktion zu bringen. –