2013-05-11 109 views
0

我想從使用friendly_id的資源路由到嵌套資源。下面是代碼:Rails - 使用friendly_id slug和嵌套資源路由錯誤

routes.rb中:

resources :products do 
    resources :reviews, except: [:index] 
end 

耙路線:

new_product_review GET  /products/:product_id/reviews/new(.:format) 

控制器:

:具體產品頁面上

@review = Review.new(product_id: params[:product_id]) 

視圖按鈕

<%= link_to(raw("<button>Write a Review</button>"), new_product_review_path(@review.product_id, @review)) %> 

產品網址:

http://localhost:3000/products/light-saber #just kidding 

但是,我得到的錯誤:

undefined method `product_id' 

我在做什麼錯在這裏?

更新-----

現在在我的控制,我有:

before_filter :setup_product 

@review = @product.reviews.new 

def setup_product 
    @product = Product.find(params[:product_id]) 
end 

我雖然還是得到同樣的錯誤。我明確的問題是,因爲我的URL沒有傳入一個整數ID,因爲我使用的是friendly_id,那麼param是如何構造的,以便控制器可以像我想要的那樣檢索產品?

UPDATE:

現在我收到此錯誤:

No route matches {:action=>"new", :controller=>"reviews", :product=>nil} 

我得到這個,當我在我的產品頁面更改代碼以:在視圖

<%= link_to(raw("<button>Write a Review</button>"), new_product_review_path(@review)) %> 
+0

這是造成問題的確切線?控制器中的一個或路由幫助器中的一個。如果你正在創建一個新的產品評論,它不應該是'new_product_review_path(@product)' – Doon 2013-05-12 00:50:36

+0

不確定 - 我沒有得到一個具體的錯誤行,請看我最新的更新,謝謝你看看! – Zephyr4434 2013-05-12 01:09:28

+1

不會將其更改爲「@ product」,而不是「@ review」。你想爲產品創建評論,你還沒有評論,因此爲零。我更新了我的答案。 – Doon 2013-05-12 01:32:09

回答

2

products/show )您需要

<%= link_to(raw("<button>Write a Review</button>"), new_product_review_path(@product)) %> 

然後在您的評論控制器,你會需要下面。

試試這個,通過協會

@product = Product.find(params[:product_id]) 
@review = @product.reviews.new 

構建它,你甚至可以將產品的發現爲before_action /的before_filter。

+0

請參閱我的更新,仍然收到錯誤 – Zephyr4434 2013-05-11 23:11:54

0

請確保您有正確的關聯關係:

class Product 
    has_many :reviews 
    ... 
end 

那你跑的遷移:當你在控制檯輸入,輸入Review,然後按回車。您應該看到評論表的列,並且應該有一個product_id列。

而且我不確定它是否是錯字,但在您的路線中,它應該是resources :products do而不是resources :productss do。請注意產品中的雙重''。

+0

是的,這些關聯在那裏:Product'has_many:reviews'和Review'belongs_to:product'。是的,這是一個錯字,是的,我可以確認評論表中的'product_id'的外鍵確實存在。我認爲我的設置是完全正確的,這就是爲什麼我無法解決這個問題 – Zephyr4434 2013-05-11 22:12:48

+0

重新啓動服務器...以防萬一你沒有。 – 2013-05-11 22:53:52

+0

是的,每次代碼更改後都做了這些以防萬一,但仍然出現錯誤 – Zephyr4434 2013-05-11 23:12:48