0

show星評価システムをアルバムページに追加する最初の ajax プロジェクトに取り組んでいます。私はこの例に従いましたが、すべてが機能します。ただし、ページをリロードするまで、各/createに対して複数のエントリを作成するアクションが常に呼び出されることに気付きました。useralbum

したがって、基本的に私の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引数を取ることを許可すると、セキュリティ上の懸念が生じますか?

4

1 に答える 1

1

いいえ、コントローラ アクションに引数を追加することは安全です。それでもやるべきではありません。更新ロジックをそれ自体のメソッドに抽出し、createupdateアクションの両方から呼び出します。

于 2013-07-07T16:45:49.143 に答える