2011-04-08 158 views
15

我正在創建一個簡單的Rails 3應用程序時遇到以下問題。它在駕駛着我。在創建嵌套資源時Rails路由與respond_with錯誤

我的模型:

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

class VehiclePicture < ActiveRecord::Base 
    belongs_to :vehicle 
end 

我的routes.rb:

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

rake routes輸出:

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

我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 

當我發佈一個新的車輛圖片爲預期的創建方法被調用,但我得到這個錯誤:如果我改變respond_withrespond_with(@picture, :location => vehicle_picture_url(@vehicle.id, @picture.id))工作的事情

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

但從我的理解我不應該這樣做。我究竟做錯了什麼?

回答

38

也花了很多時間與那件事。 你應該使用:

respond_with(@vehicle, @picture) 
+0

謝謝你很多!需要接受! – 2012-08-20 13:44:48

+0

我愛你,但這是記錄在哪裏!?太令人沮喪了...... – 2012-10-18 01:53:29

+1

這裏記錄了http://api.rubyonrails.org/classes/ActionController/Responder.html – malclocke 2012-11-13 01:11:24

2

在某些情況下,這也是有道理的:

respond_with(:admin,@picture)