0

这是一个我确信很容易解决的问题,部分归因于我自己缺乏知识,但我做了一些搜索,无法找到解决我问题的正确方法。

在我的情况下,我有一个Product类,它有很多Review对象。评论也属于用户。假设我已经正确定义了我的模型,我很难弄清楚如何正确地将:product_id变量传递到评论中,以便在提交时将给定的评论与给定的产品联系起来。

到目前为止,我所拥有的是一个显示产品信息的视图以及<%= link_to 'Review Product', new_review_path(:product_id => @product.id) %>. 添加新评论的结果视图表单(旨在用于该产品)看起来至少有些正确,因为 URL 显示为http://localhost:3000/reviews/new?product_id=1。正如我所提到的,我已经完成了先前的搜索,并且已经提供了对我的问题的类似答案,但它并没有解决问题,因为当我显示@review实例变量的值时,每个属性都是 nil。

在我的reviews_controller.rb文件中,我可以分配这些变量——至少在操作的表单中,通过执行类似于以下的操作:

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

我还可以通过执行类似的操作并传递current_user变量(由设计 gem 处理)来分配user_id变量。我知道 Rails 使用的创建操作通常会根据我读过的所有内容创建变量的新实例。但是,这样做会导致数据丢失,但我在表单中输入的变量除外。从技术上讲,我应该可以在create操作中传递current_user变量,但我无法传递(或不知道如何传递)product 变量。对于它的价值,我现在没有使用任何类型的嵌套路由,但我不知道这是否是一个直接的解决方案。

如果有人对我可以做些什么来解决这个问题有更好的了解,我将不胜感激。我敢肯定,正如我所暗示的,这是一个业余错误。

PS如果问题措辞尴尬,我深表歉意,因为我不确定描述它的最佳方式。

4

2 回答 2

0

嵌套资源路由可能是最好的方法。
@PhilipHallstrom 的方式适用于form元素,但如果您正在寻找Restful方法:

# Add nested resource route 
# /config/routes.rb
resources :products do
    resources :reviews
end


# In your 'products/show.erb.html'; @product will be the instance you want to review
<%= link_to 'Review Product', new_product_review_path(@product) %> # gets you to ReviewController#new

# In your ReviewsController#new
@product = Product.find(params[:product_id])
@review = @product.reviews.new #this should have product_id


# In your 'reviews/new.erb.html'
<% form_for [ @product, @review ] %> # gets you to ReviewController#create


# In your ReviewsController#create
@product = Product.find(params[:product_id])
@review = @product.reviews.new(params[:review]) # params from the previous form
@review.user = current_user
@review.save

就通过current_user@product通过不起作用的表单参数而言。从技术上讲,您不能通过 HTTP 传递实际的 Ruby 对象。

current_user仍将存在于控制器中,因此没有意义,而且对安全性不利。

@product您将需要从控制器查询数据库,使用product_id

于 2012-12-09T13:38:05.773 回答
0

如果您不使用 Qumara 建议的嵌套路由(我同意),那么您需要设置将以下内容添加到 app/views/reviews/new.html.erb 以便它可用于您的创建操作。

<%= r.hidden_field :product_id %>

当然请记住,这意味着如果我知道产品 ID,我可以破解您的表单并将我的评论设置为我想要的任何产品。所以你可能想考虑一下...

于 2012-11-30T22:57:25.277 回答