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を使用しているときに再度押されないようにします。

前者を理解するのはそれほど難しいことではないように感じますが、それは私を打ち負かします。2番目の目標をどこから始めればよいのかよくわかりません。


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は問題が発生する可能性があります。2人のユーザーが自分のWebページにアパートをロードしたと想像してください。それらの1つはそれが役立つとマークし、次の1つも同様に役立ちます。彼らが最初にページをロードしたときhelpful_countは同じだったので、両方が[役立つ]をクリックした後、カウントは1つだけ増加します。つまり、同じ値に2回更新されます。

本当に、あなたはおそらくアパートのレビューリソースの下で、新しいアクションを作成したいと思っています。そのアクションは、ActiveRecordのincrementメソッドを使用して更新することができますhelpful_count(技術的には、競合状態がまだ存在するためincrement!、発生する頻度ははるかに低くなります)http://apidock.com/rails/ActiveRecord/Persistence/increment%21

クッキーは後者の問題の合理的な解決策のようです。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 %> 

ReviewsControllerクラス内:

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"

ここでの主な考え方は、リソースがhttpメソッドeditを使用する必要があり、その変更はそのリソースのコントローラーによって処理される必要があるということです。PUTRailsの組み込みAJAX関数は、ヘルパー:remote => true内に設定することで機能します。link_to2番目の概念は、ナンスの概念です。これは、1回だけ有効なランダムな値です。この値がユーザーのセッションで設定されると、以降の要求incHelpfulは何もしません。

于 2013-01-08T22:19:59.163 に答える