因此,为了简化我有什么,有我的应用程序3种主力机型; 城市,餐厅和配方。 一个城市有许多餐馆和一间餐厅有很多食谱。 每个城市都有一个页面,其中列出了在这个城市的餐馆,同样每家餐厅网页在其页面中列出的食谱。 还有在我的城市页面中的“添加新餐厅”按钮,当用户点击该用户被引导到与下面的链接新餐厅页:
<%= link_to 'Add New Restaurant', new_restaurant_path %>
但是这个页面是一个通用的页面,用户可以将餐厅添加到任何一个城市,如何修改我的设计,这样,新的餐厅形式只会增加一个新的餐馆到那个城市。
编辑:谢谢你的答案。 所以这是我的店现在制作方法。因为new_restaurant_path是一种形式,它具有其他PARAMS不仅仅是一个城市。 所以,我知道我可以做@city弄清楚这个城市我的餐厅= City.find(PARAMS [:市]),但我怎么在这行@restaurant = Restaurant.new添加此向则params的其余部分( PARAMS [:餐厅])
def create
@restaurant = Restaurant.new(params[:restaurant])
end
随着航线
您可以创建这样的路线:
/cities/:city_id/restaurants/new
有:
resources :city do
resources :restaurants
end
和辅助:
<%= link_to 'Add New Restaurant', new_city_restaurant_path(city) %>
随着帮手PARAMS
或者,你可以在你当前的路线助手传递参数,并在你的控制器处理:
<%= link_to 'Add New Restaurant', new_restaurant_path(city_id: city.id) %>
这将使使用这个网址:
/restaurants/new?city_id=123
对于这两种方法,控制器
并且在控制器:
def create
city = City.find(params[:city_id])
@restaurant = city.restaurants.build params[:restaurant]
if @restaurant.save
...
end
2种方法来实现这一目标
1)嵌套路由添加到您的城市道路餐馆再使用new_city_restaurants_path(@city.id)
你将不得不要么创建文件夹和视图里面你的城市夹或将所有的餐馆城市文件夹内的文件夹。 这里也将是其他几个位和piees,将需要整理,如控制器和助手,这可能不适合。
因此,可能更简单
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对象预先选择的城市。 这样,就没有必要改变任何代码params哈希表或控制器创建行动。 这是很难进一步建议,因为我没有你new.html.erb代码这个你接受的答案交易在错误的道路IMO。
您也可以从Ryan Bates的不错的影片之一在嵌套资源中获益http://railscasts.com/episodes/139-nested-resources