2

一个apartment_listing有很多reviews,一个review属于一个apartment_listing

在文件views/apartment_listings/show.html.erb中,我显示了该特定的评论列表apartment_listing。这些评论是使用部分视图生成的,apartment_listings/_review.html.erb如下所示:

<%= render :partial => "review", :collection => @apartment_listing.reviews %>

_review中,我想要一个按钮,按下时:

  1. 增加评论的helpful_count属性。
  2. 使其无法在同一浏览器中再次按下 - 可能使用 cookie。

我觉得前者不应该太难弄清楚,但它让我打败了。我真的不知道从哪里开始第二个目标。


编辑:我设法helpful_count用以下代码更新了评论的属性apartment_listings/_review.html.erb

<%= form_for review, :method => :put, :remote => true do |f| %>
  <%= f.hidden_field :helpful_count, value: (review.helpful_count + 1) %    > 
  <%= f.submit 'Helpful?' %>
<% end %>

但是,我不确定这是否是最好的方法,并且我希望能够在单击按钮后禁用该按钮。

4

2 回答 2

2

您的更新代码helpful_count可能会出现问题。想象一下,两个用户在他们的网页上加载了一套公寓。其中一个标记它有帮助,下一个也标记它有帮助。因为当他们最初加载页面时,helpful_count是相同的,在他们都点击帮助后,计数只会增加一:它会更新两次到相同的值。

确实,您想创建一个新操作,可能在公寓的评论资源下。该操作可以使用 ActiveRecord 的increment方法来更新helpful_count(从技术上讲,在 中仍然存在竞争条件increment!,您遇到的频率要少得多)http://apidock.com/rails/ActiveRecord/Persistence/increment%21

对于后一个问题,Cookie 似乎是一个合理的解决方案。只需使用 jQuery 在表单上绑定提交,并在处理程序中创建 cookie。

于 2013-01-08T22:18:33.877 回答
2

您的控制器中的代码是什么样的reviews?更有经验的 RESTful 编码人员可能能够更连贯地谈论这一点,但在我看来,增加helpful_count属性应该是发送到reviews控制器的操作。这样,您可以创建一个异步执行操作的链接。

例如,在 _review.html.erb 内部:

<% collection.each do |review| %>
<%= link_to "Mark as Helpful", "/apartment_listing/#{@apartment_listing.id}/reviews/#{@review.id}/incHelpful?nonce=#{SecureRandom.rand(16)}", :remote => true, :method => :put %>
# ... Do something cool with your review content ...
<% end %> 

在您的 ReviewController 类中:

def incHelpful
  unless params[:nonce] == session[:nonce][params[:id]]
    @review = Review.find(params[:id])
    @review.helpful_count += 1
    @review.update_attributes(:helpful_count)
    session[:nonce][params[:id]] = params[:nonce]
  end
  render :nothing
  # Optionally return some javascript or JSON back to the browser on success/error
end

/config/routes.rb 内部:

put "apartment_listing/:apart_id/reviews/:id/incHelpful" => "reviews#incHelpful"

这里的主要思想是edit资源应该使用PUThttp 方法的操作,并且该更改应该由该资源的控制器处理。Rails 的内置 AJAX 函数通过设置:remote => truelink_to帮助程序中来使用。第二个概念是随机数,一个仅有效一次的随机值。一旦在用户的会话中设置了这个值,后续的请求incHelpful将不会做任何事情。

于 2013-01-08T22:19:59.163 回答