2013-02-08 75 views
0

位置有列表。从位置索引中,我希望用户能够添加新的列表(属于该位置),然后重定向到更新的索引。嵌套路由在创建时失败

我的路线如下:

match 'listings/search' => 'listings#search' 
resources :locations do 
    resources :listings 
end 
resources :locations 
resources :listings 
match "listings/:location" => 'listings#show' 

下面是上市的形式:

<%= form_for(@listing, :url=>"/locations/#{@location_id}/listings") do |f| %> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

我想这应该调用创建方法listings_controller:

def create 
    @location= Location.find(params[:location_id]) 
    @location_id = @location.id 
    @listing = @location.listings.create(params[:listing]) 

    respond_to do |format| 
    if @listing.save 
     redirect_to location_listings_path(@location_id) 
    else 
     format.html { render action: "new" } 
    end 
    end 
end 

当我按提交时,它重定向到/位置/ 1 /列表 这是确切的我想要什么。但窗口是空白的。如果我按刷新(任何其他时间访问位置/ 1 /列表),它会正确显示索引。

+0

您可以删除'respond_to'块(留下内容),但将else改为“render:new”。 – jvnill

+0

哇。非常感谢。这是从脚手架代码中遗留下来的,我从不会认为这是罪魁祸首。它现在正常工作! – tuna

+0

很高兴能有所帮助:)祝你好运! – jvnill

回答

1

你也可以改变你的form_for到:

<%= form_for([@location, @listing]) do |f| %> 

所以你不必添加:URL的一部分。

+0

华丽!我一直在想如何做到这一点。 – tuna

0

一些改造完成:

# config/routes.rb 
resources :locations do 
    resources :listings 
    get :search, on: :collection # will be directed to 'locations#search' automatically 
end 

resources :listings 

形式的URL,可以使用这样或方式彼得建议:

<%= form_for(@listing, url: location_listings_path(@location)) do |f| %> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

而且你的控制器可以被清理,以及:

# app/controllers/listings_controller.rb 
def create 
    @location = Location.find(params[:location_id]) 
    @listing = @location.listings.build(params[:listing]) 

    if @listing.save 
    redirect_to location_listings_path(@location_id) 
    else 
    render action: :new 
    end 
end