嵌套路由在创建时失败

时间:2013-02-08 08:58:52

标签: ruby-on-rails

地点有列表。从位置索引,我希望用户能够添加新的列表(属于该位置),然后重定向到更新的索引。

我的路线如下:

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

我认为应该在listing_controller中调用create方法:

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

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

2 个答案:

答案 0 :(得分:1)

您还可以将form_for更改为:

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

所以你不必添加:url部分。

答案 1 :(得分:0)

完成了一些改造:

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

resources :listings

表格网址可以像这样或彼得提出的方式使用:

<%= 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