0

我正在开发我的第一个 ajax 项目,为专辑show页面添加星级评分系统。我按照这个例子,一切正常。但是我注意到,在我重新加载页面之前,该create操作总是被称为为每个user/创建多个条目album

所以基本上我的星数据库得到了这个:

<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 回答