我正在制作我的第一个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
采取争论是否存在任何安全问题?
答案 0 :(得分:1)
不,为控制器操作添加参数是安全的。但是仍然不应该这样做。将更新逻辑提取到自身的方法中,并从create
和update
操作中调用它。