show
星評価システムをアルバムページに追加する最初の ajax プロジェクトに取り組んでいます。私はこの例に従いましたが、すべてが機能します。ただし、ページをリロードするまで、各/create
に対して複数のエントリを作成するアクションが常に呼び出されることに気付きました。user
album
したがって、基本的に私のStarデータベースは次のようになりました。
<Star id: 9, created_at: ..., updated_at: ..., user_id: 2, album_id: 8, rating: 3>,
<Star id: 10, created_at: ..., updated_at: ..., user_id: 2, album_id: 8, rating: 5>,
<Star id: 11, created_at: ..., updated_at: ..., user_id: 2, album_id: 8, rating: 3>,
明らかに受け入れられません。
私の最初のアイデアはdelete
、新しいレーティングを作成する前に以前のレーティングにすることでしたが、代わりにcontroller
class StarsController < ApplicationController
def create
@album = Album.find(params[:album_id])
star_rated(@album)
@star = Star.new(params[:star])
@star.album_id = @album.id
@star.user_id = current_user.id
if @star.save
respond_to do |format|
format.html { redirect_to album_url(@album), :notice => "Rating logged" }
format.js
end
end
end
def update(star = nil)
@star = star
@star ||= current_user.stars.find_by_album_id(params[:album_id])
if @star.update_attributes(params[:star])
format.html { redirect_to album_url(@album), :notice => "Rating logged" }
format.js
end
end
private
def star_rated(album)
if star = current_user.stars.find_by_album_id(album.id)
update(star)
end
end
end
そして、それは機能し、他の誰かが同様のことをしたかどうかを確認するためにしばらくの間検索していたことを除いて、私は満足していますdelete
.それは悪い習慣ではないかと心配しています。
また、引数を取ることもできますupdate
。先週、SQL インジェクションについて読んだばかりで、一般的に、ある場所に注入されることについて心配しています。update
引数を取ることを許可すると、セキュリティ上の懸念が生じますか?