Rails和SQL的新手,我尝试访问我的应用中的关联。
我有一个行程网络应用程序,用户可以来这里下载行程。作为流程的一部分,他们可以将评论留给他们的想法。如果需要,我希望评论的所有者能够在思考之后编辑或删除她的评论,但是以下的Active Record Association正在为@ itinerary.reviews.user_id返回错误:
undefined method `user_id' for #<Review::ActiveRecord_Associations_CollectionProxy:0x007fb969392978>
在我的itineraries_helper中:
def user_is_reviewer?
@itinerary = Itinerary.find(params[:id])
!!current_user.id == @itinerary.reviews.user_id
end
在我看来:
<div class = "review-container">
<h2>What Travelers Thought</h2>
<% if @itinerary.reviews.count > 0 %>
<% @itinerary.reviews.each do |review| %>
<div class = "reviews">
<div class = "star-rating" data-score= <%= review.rating %> ></div>
<p>
<%= review.comment %>
</p>
<% if user_is_reviewer? %>
<% link_to "Edit", edit_itinerary_review_path(@itinerary, @review) %>
<% end %>
<% end %>
</div>
问题:
答案 0 :(得分:0)
Review.first
将返回您的审核对象,并且您正在Review.first.user_id
而
itinerary.reviews
返回属于特定行程的所有评论的集合,它是活动记录对象的集合,并且您尝试从活动记录集合中访问user_id,这不会起作用。
您可以通过将审核ID传递给您的帮助方法
来解决此问题def user_is_reviewer?(review_id)
review = Review.find(review_id)
!!current_user.id == review.user_id
end
在您的视图中更新帮助方法以传递审核ID
<% if user_is_reviewer?(review) %>
<% link_to "Edit", edit_itinerary_review_path(@itinerary, @review) %>
<% end %>
或者你可以简单地没有辅助方法,因为你已经有了一个评论对象,如你所看到的那样
<% if current_user.id == review.user_id %>
<% link_to "Edit", edit_itinerary_review_path(@itinerary, @review) %>
<% end %>