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

lists_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/listings にリダイレクトされます。でも窓は真っ白。更新を押すと (ロケーション/1/リストにいつでもアクセスできます)、インデックスが正しく表示されます。

4

2 に答える 2

1

form_for を次のように変更することもできます。

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

したがって、:url 部分を追加する必要はありません。

于 2013-02-08T09:12:47.133 に答える
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
于 2013-02-08T09:17:45.200 に答える