控制器`create`方法调用`update`方法

时间:2013-07-07 16:39:12

标签: ruby-on-rails ajax

我正在制作我的第一个ajax项目,将星级评分系统添加到专辑show页面。我按照this示例,一切正常。但是我注意到,在我重新加载页面之前,始终会调用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采取争论是否存在任何安全问题?

1 个答案:

答案 0 :(得分:1)

不,为控制器操作添加参数是安全的。但是仍然不应该这样做。将更新逻辑提取到自身的方法中,并从createupdate操作中调用它。