我正在尝试使用friendly_id从资源路由到嵌套资源。以下是代码:
routes.rb中:
resources :products do
resources :reviews, except: [:index]
end
rake routes:
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是否构造成控制器可以像我想要的那样检索产品?
更新:
现在我收到了这个错误:
No route matches {:action=>"new", :controller=>"reviews", :product=>nil}
当我将“产品”页面中的代码更改为:
时,我得到了这个<%= link_to(raw("<button>Write a Review</button>"), new_product_review_path(@review) ) %>
答案 0 :(得分: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中。
答案 1 :(得分:0)
确保您拥有正确的关联:
class Product
has_many :reviews
...
end
您运行了迁移:当您进入控制台时,请键入Review
并按Enter键。您应该看到评论表的列,并且应该有一个product_id
列。
我不确定这是不是一个错字,但在你的路线中应该是resources :products do
而不是resources :productss do
。注意产品中的双重'。