0

我正在尝试使用friendly_id 从资源路由到嵌套资源。下面是代码:

路线.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,因为我使用了友好 ID,所以参数是否结构化,以便控制器可以像我想要的那样检索产品?

更新:

现在我收到此错误:

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

当我将产品页面中的代码更改为:

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

2 回答 2

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 中。

于 2013-05-11T21:49:17.953 回答
0

确保您有正确的关联:

class Product
  has_many :reviews
  ...
end

您运行了迁移:当您在控制台中输入时,键入Review并按 Enter。您应该会看到评论表的列,并且应该有一product_id列。

而且我不确定这是否是错字,但在您的路线中应该是resources :products do而不是resources :productss do。请注意产品中的双“s”。

于 2013-05-11T21:55:22.643 回答