Ruby on rails 3 防止多重创建';RubyonRails应用程序中的
我有一个控制器,看起来像这样:Ruby on rails 3 防止多重创建';RubyonRails应用程序中的,ruby-on-rails-3,form-submit,Ruby On Rails 3,Form Submit,我有一个控制器,看起来像这样: def new @title = "Add New Post" @post = Post.new end def create @title = "Add New Post" @post = Post.new(params[:post]) if @post.save flash[:success] = @post.name+" successfully added. Thank you!"
def new
@title = "Add New Post"
@post = Post.new
end
def create
@title = "Add New Post"
@post = Post.new(params[:post])
if @post.save
flash[:success] = @post.name+" successfully added. Thank you!"
redirect_to @post
else
render 'new'
end
end
问题是,如果用户成功地创建了一篇新文章,然后决定通过按下后退按钮并再次点击“保存”来更改某些内容,我会得到重复的条目
预防这种情况的最好方法是什么?我认为创建操作在Rails中是自动的POST请求,所以浏览器应该说“你确定要重新发送数据吗,等等…”
运行rake路由确实显示了这一点:
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
这只是一个需要考虑的方向——当您收到创建新帖子的请求时,您可以检查当前用户是否存在具有相同标题的帖子。但只有标题相同的帖子存在的事实并不意味着你应该更新它。在这里,您应该决定如何确定是否需要更新或保存帖子。一种可能的解决方案是比较请求时间和在创建的现有帖子的
或在
时间更新的帖子的(例如,您可以更新在最后一个小时内创建的帖子)
另一种方法(似乎比前一种方法更好)可能是分别向数据库表posts
和模型Post
添加字段和属性,这将存储Post的唯一标识符(例如一些散列)(当然不是id
,因为目前还不存在Post,它可能是一个哈希时间戳)。然后,您可以在表单中添加一个隐藏的输入字段,并将其值设置为该唯一标识符。这样,当用户点击“后退”按钮时,他会使用已为现有帖子设置的标识符进入表单,现在在他第二次提交表单后,您可以通过该唯一标识符找到帖子并更新它。这是一个很好的建议但在保存后,我只是将用户重定向到一个带有他们刚刚保存的模型的“编辑”页面。我相信这已经解决了大多数重复定位的帖子。是的,我认为这种方法应该可以处理大多数情况。但是如果你想保证即使用户点击后退按钮也不会有任何问题(或者只是为了不限制自己重定向到编辑页面),您应该使用类似于我的建议的内容