1

因此,为了简化我所拥有的,我的应用程序中有 3 个主要模型;城市、餐厅和食谱。一个城市有很多餐厅,一个餐厅有很多菜谱。每个城市都有一个页面列出该城市的餐馆,同样每个餐馆页面都有其页面中列出的食谱。在我的城市页面中还有一个“添加新餐厅”按钮,当用户单击此按钮时,用户将被带到带有以下链接的新餐厅页面:

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

但是这个页面是一个通用页面,用户可以将餐厅添加到任何城市,我如何修改我的设计,以便新的餐厅表单只会向该城市添加新餐厅。

编辑:感谢您的回答。所以这是我现在的餐厅创建方法。因为 new_restaurant_path 是一种形式,它有其他参数,而不仅仅是一个城市。所以我知道我可以通过 @city = City.find(params[:city]) 来计算我餐厅的城市,但是我如何将它添加到这一行的其余参数中 @restaurant = Restaurant.new(参数[:餐厅])

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 来预先选择城市。这样就无需更改参数哈希或控制器创建操作中的任何代码。由于我没有您的 new.html.erb 代码,因此很难进一步提供建议您接受的答案以错误的方式处理 IMO。

于 2013-05-05T23:34:06.733 回答
0

您还可以从 Ryan Bates 关于嵌套资源的精彩视频之一中受益http://railscasts.com/episodes/139-nested-resources

于 2013-05-06T00:15:58.903 回答