1

私が持っているものを単純化するために、私のアプリケーションには 3 つの主要なモデルがあります。都市、レストラン、レシピ。都市には多くのレストランがあり、レストランには多くのレシピがあります。すべての都市にはその都市のレストランをリストするページがあり、同様にすべてのレストランのページにはページにリストされているレシピがあります. 私の街のページには「新しいレストランを追加」ボタンもあり、ユーザーがこれをクリックすると、ユーザーは次のリンクを含む新しいレストランのページに移動します。

<%= link_to 'Add New Restaurant', new_restaurant_path %>

しかし、このページは、ユーザーが任意の都市にレストランを追加できる一般的なページです。新しいレストラン フォームがその都市にのみ新しいレストランを追加するようにデザインを変更するにはどうすればよいですか。

編集:答えてくれてありがとう。これが私のレストランの作成方法です.. new_restaurant_path はフォームであり、都市以外のパラメータを持っているためです。@city = City.find(params[:city]) を実行することでレストランの都市を把握できることを理解していますが、これをこの行の残りのパラメーターに追加するにはどうすればよいですか @restaurant = Restaurant.new( params[:レストラン])

def create
    @restaurant = Restaurant.new(params[:restaurant])

  end
4

3 に答える 3

3

ルートあり

次のようなルートを作成できます。

/cities/:city_id/restaurants/new

と:

resources :city do
  resources :restaurants
end

そしてヘルパー:

<%= link_to 'Add New Restaurant', new_city_restaurant_path(city) %>

ヘルパーにパラメーターを使用

または、現在のルート ヘルパーにパラメーターを渡して、コントローラーで処理することもできます。

<%= link_to 'Add New Restaurant', new_restaurant_path(city_id: city.id) %>

これにより、次の URL が使用されます。

/restaurants/new?city_id=123

どちらのアプローチでも、コントローラー

そしてコントローラーで:

def create
  city = City.find(params[:city_id])
  @restaurant = city.restaurants.build params[:restaurant]
  if @restaurant.save
    ...
end
于 2013-05-05T23:32:05.883 に答える
2

これを実現する2つの方法

1) レストランの都市パスにネストされたルートを追加してnew_city_restaurants_path(@city.id) から、都市フォルダー内にフォルダーとビューを作成するか、すべてのレストラン フォルダーを都市フォルダー内に移動する必要があります。コントローラーやヘルパーなど、片付けが必要な他のいくつかのビットやパイもあり、これは適していない可能性があります。

おそらくもっと単純です

2) 都市 ID をパラメーターとして link_to に追加し、レストラン コントローラーの新しいアクションを変更して、都市 ID の存在を確認し、適切なアクションを実行して、このような結果になる可能性があります。

<%= link_to 'Add New Restaurant', new_restaurant_path(:city => @city.id) %>

次に、コントローラーの新しいアクションにチェックを追加します

  def new
    if params[:city]
      #find the city and build a new restaurant object
      city = City.find(params[:city_id])
      @restaurant = city.restaurants.build params[:restaurant]
    else
      # just create a new restaurant object as normal
      @restaurant = Restaurant.new  
    end
    # ...Rest of action
  end

コメントに応じて編集

都市オブジェクトに対してレストランを構築したため、都市 ID がレストラン オブジェクトに割り当てられます。これを処理する方法は、new.html.erb テンプレートのコードによって異なります。

都市選択ボックスがある場合は、@restaurant オブジェクトの都市 ID を使用して都市を事前に選択します。そうすれば、params ハッシュまたはコントローラーの create アクションのコードを変更する必要がなくなります。私はあなたの new.html.erb コードを持っていないので、これ以上アドバイスするのは難しいです.

于 2013-05-05T23:34:06.733 に答える
0

また、ネストされたリソースに関する Ryan Bates の素晴らしいビデオの 1 つを利用することもできますhttp://railscasts.com/episodes/139-nested-resources

于 2013-05-06T00:15:58.903 に答える