2011-04-08 7 views
15

Tengo el siguiente problema con una aplicación sencilla de Rails 3 que estoy creando. Me está volviendo loco.Error de enrutamiento de rieles con respond_with al crear un recurso anidado

Mi modelo:

class Vehicle < ActiveRecord::Base 
    has_many :vehicle_pictures, :dependent => :destroy 
def 

class VehiclePicture < ActiveRecord::Base 
    belongs_to :vehicle 
end 

Mi routes.rb:

MyApp::Application.routes.draw do 
    resources :vehicles do 
     resources :pictures, :controller => :vehicle_pictures 
    end 
end 

Mi rake routes de salida:

vehicle_pictures GET /vehicles/:vehicle_id/pictures(.:format)   {:action=>"index", :controller=>"vehicle_pictures"} 
        POST /vehicles/:vehicle_id/pictures(.:format)   {:action=>"create", :controller=>"vehicle_pictures"} 
new_vehicle_picture GET /vehicles/:vehicle_id/pictures/new(.:format)  {:action=>"new", :controller=>"vehicle_pictures" 
edit_vehicle_picture GET /vehicles/:vehicle_id/pictures/:id/edit(.:format) {:action=>"edit", :controller=>"vehicle_pictures"} 
    vehicle_picture GET /vehicles/:vehicle_id/pictures/:id(.:format)  {:action=>"show", :controller=>"vehicle_pictures"} 
        PUT /vehicles/:vehicle_id/pictures/:id(.:format)  {:action=>"update", :controller=>"vehicle_pictures"} 
        DELETE /vehicles/:vehicle_id/pictures/:id(.:format)  {:action=>"destroy", :controller=>"vehicle_pictures"} 

Mi vehicle_pictures_controller.rb:

class VehiclePicturesController < ApplicationController 

    before_filter :find_vehicle 

    respond_to :html, :json, :xml 

    private 
    def find_vehicle 
    @vehicle = Vehicle.find(params[:vehicle_id]) 
    end 

    public 

    # GET /vehicle/:id/pictures 
    def index 
    @pictures = @vehicle.vehicle_pictures 

    respond_with(@pictures) 
    end 

    # GET /vehicle/:vehicle_id/pictures/new 
    def new 
    @picture = VehiclePicture.new 
    @picture.vehicle = @vehicle 

    respond_with(@picture) 
    end 

    # POST /vehicle/:vehicle_id/pictures 
    def create 
    @picture = @vehicle.vehicle_pictures.build(params[:vehicle_picture]) 

    flash[:notice] = 'Vehicle picture was successfully created.' if @picture.save 

    respond_with(@picture) 
    end 

    # GET /vehicle/:vehicle_id/pictures/:id 
    def show 
    @picture = @vehicle.vehicle_pictures.find(params[:id]) 
    respond_with(@picture) 
    end 

    # DELETE /vehicle/:vehicle_id/pictures/:id 
    def destroy 
    @picture = @vehicle.vehicle_pictures.find(params[:id]) 
    @picture.destroy 
    respond_with(@picture) 
    end 

end 

cuando publico una nueva imagen del vehículo al método create se invoca como se esperaba, pero me sale este error:

No route matches {:controller=>"vehicle_pictures", :action=>"show", :vehicle_id=>#<VehiclePicture id: 24, created_at: "2011-04-08 15:07:53", updated_at: "2011-04-08 15:07:53", picture: nil, description: "", vehicle_id: 1>} 

Si cambio los respond_with a respond_with(@picture, :location => vehicle_picture_url(@vehicle.id, @picture.id)) cosas funcionan.

Pero por lo que entiendo, no debería tener que hacer esto. ¿Qué estoy haciendo mal?

Respuesta

38

También pasa mucho tiempo con esa cosa. Deberá utilizar:

respond_with(@vehicle, @picture) 
+0

Gracias mucho! ¡Necesito aceptar! –

+0

Te amo, pero ¿dónde está esto documentado? Tan frustrante ... –

+1

Documentado aquí http://api.rubyonrails.org/classes/ActionController/Responder.html – malclocke

2

En algunos casos, esto también tiene sentido:

respond_with(:admin,@picture) 
Cuestiones relacionadas