2013-05-07 101 views
0

我知道在嵌套資源中,您必須傳遞包含資源的id才能使其工作。Rails-如何在包含資源時路由到嵌套資源未設置

但是,我想允許用戶爲產品創建一個評論,並在新視圖中指定表單中的產品,而不是實際將其傳入到路徑中。因此,不要在產品上進行審覈,而應該有一個主審查表格,您可以在表格中選擇任何產品。

我收到一個錯誤,試圖做到這一點,無法弄清楚 - 什麼是解決方案?

#error 
No route matches {:action=>"new", :controller=>"reviews"}  

#view 
new_product_review_path 

#controller 
def new 
    #@product = Product.new 
    @review = Review.new 
end 

#routes.rb 
resources :products do 
    resources :reviews 
end 
+0

順便說一句,爲什麼你的行爲中有@product = Product.new? – 2013-05-07 05:32:39

回答

1

請評論嵌套產品中的東西來包裝你的路線,但移動創造的評論外:

# routes.rb 
resources :products do 
    resources :reviews, except: [:new, :create] 
end 

resources :reviews, only: [:new, :create] 

然後使用new_review_path創建一個新的審查。

如果您想要創建附加到特定產品的評論選項,請刪除嵌套評論的:except選項,並根據product_id.present?修改控制器操作和表單。


編輯:(爲響應和風的跟進問題)

在上面的例子中,我指定的:new:create應該只訪問以外的產品,而不是在它裏面通過使用:except:only選項進行評論 - 如果您希望能夠對評論做任何事情,無論其是否嵌套,都可隨意放棄。唯一需要注意的是相同的控制器操作將處理請求,無論它是否嵌套 - 例如,reviews#index將同時處理/reviews/products/1/reviews - 因此您需要確保控制器妥善處理。例如,使用過濾器前:

# users_controller.rb 
before_filter :filter_by_product 

def filter_by_product 
    @parent_product = Product.find(params[:product_id]) if params[:product_id] 
    @reviews = @parent_product ? @parent_product.reviews : Review.all 
end 

def new 
    @review = @reviews.build 
end 

... 

您可能還需要進行修改,基於無論是嵌套的或不是你的看法。例如,在創建評論的表單中,如果產品沒有嵌套,則可以使用產品下拉菜單,或者使用product_id的隱藏字段替換該產品。

+0

我可以只添加資源:在路徑文件中的產品塊之外進行評論並將其保留在那裏,因此可以訪問嵌套和未嵌入的資源?我已經在其他答案中看到過這個答案 – Zephyr4434 2013-05-08 03:03:39

+0

是的,沒有什麼可以阻止你這麼做,這正是我在答案結尾處指出的。在這種情況下,兩條路徑都會調用相同的控制器操作,因此您需要確保它(以及可能的視圖)正常工作。我已經添加了一些答案來擴展這一點。 – 2013-05-08 03:45:44

+0

非常感謝您的詳細解答 – Zephyr4434 2013-05-15 00:45:22

-1

移動資源:塊

resources :products 
resources :reviews 

,並使用

new_review_path 

這樣外面的評論,您的評論是不束縛於任何產品。

+0

有其他解決方法嗎?對於我的應用程序來說,評論只在產品環境中才有意義,所以它似乎是使用嵌套路線的理想情況... – Zephyr4434 2013-05-07 14:43:52

0

您可以使用namespace的事情與其他

+0

我不確定我是否理解,請您具體一點?對不起剛剛這個。 – Zephyr4434 2013-05-07 14:44:16