Rails - 使用friendly_id slug和嵌套资源进行路由错误

时间:2013-05-11 21:44:08

标签: ruby-on-rails

我正在尝试使用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) ) %>

2 个答案:

答案 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。注意产品中的双重'。