Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 防止多重创建';RubyonRails应用程序中的_Ruby On Rails 3_Form Submit - Fatal编程技术网

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,它可能是一个哈希时间戳)。然后,您可以在表单中添加一个隐藏的输入字段,并将其值设置为该唯一标识符。这样,当用户点击“后退”按钮时,他会使用已为现有帖子设置的标识符进入表单,现在在他第二次提交表单后,您可以通过该唯一标识符找到帖子并更新它。

这是一个很好的建议但在保存后,我只是将用户重定向到一个带有他们刚刚保存的模型的“编辑”页面。我相信这已经解决了大多数重复定位的帖子。是的,我认为这种方法应该可以处理大多数情况。但是如果你想保证即使用户点击后退按钮也不会有任何问题(或者只是为了不限制自己重定向到编辑页面),您应该使用类似于我的建议的内容