2013-05-05 127 views
1

所以爲了簡化我的應用,我的應用程序中有3個主要模型;城市,餐廳和食譜。一個城市有許多餐館,一家餐廳有很多食譜。每個城市都有一個列出該城市餐館的頁面,同樣,每個餐館頁面都有其頁面中列出的食譜。還有一個在我的城市頁面中的「添加新餐廳」按鈕,當用戶點擊該用戶被引導到新的餐廳頁面下面的鏈接:Rails模型設計決定

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

您可以用'city.restaurants.build'代替Restaurant.new'的',你已經初始化城市,當然之後。 – juanpastas 2013-05-06 00:56:31

回答

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 
+0

您應該在新行動中構建城市而不是創建行爲,並且您不處理如何處理new.html.erb表單以使城市回到創建行動 – jamesc 2013-05-06 02:06:17

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散列或控制器創建操作中的任何代碼。由於我沒有new.html.erb代碼,因此很難提供進一步的建議。您接受的答案以錯誤的方式處理IMO。

+0

@juanpastas的回覆發佈在與我的同一時間,基本上是說同樣的事情 – jamesc 2013-05-05 23:35:57

+0

感謝您的答案。因爲new_restaurant_path是一種形式,它具有其他參數而不僅僅是一個城市。所以我明白我可以通過@city = City.find(params [:city])找出我的餐廳的城市,但是如何將此添加到此行的其他參數餐廳= Restaurant.new(params [:restaurant]) – 2013-05-05 23:57:01

+0

@GorkemYurtseven它是處理表單事件而不是新行爲的創建操作。我會更新我的答案 – jamesc 2013-05-06 01:52:49