我正在开发我的第一个 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
争论是否会带来任何安全问题?