0

次のようなコントローラーがあります。

  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ではcreateアクションは自動的にPOSTリクエストになると思っていたので、ブラウザは「Are you sure you want to resend the data, bla bla bla...」のように言うべきです。

rake routes を実行すると、次のようになります。

            POST   /posts(.:format)                                     posts#create
new_post    GET    /posts/new(.:format)                                 posts#new
4

1 に答える 1

2

考えるべき方向性 - 新しい投稿を作成するリクエストを受け取ったときに、たとえば同じタイトルの投稿が現在のユーザーに存在するかどうかを確認できます。ただし、同じタイトルの投稿が存在するという事実だけでは、それを更新する必要はありません。ここで、投稿を更新または保存する必要があるかどうかを判断する方法を決定する必要があります。created_at考えられる解決策の 1 つは、リクエストの時刻と既存の投稿または時刻を比較することupdated_atです (たとえば、過去 1 時間以内に作成された投稿を更新することができます)。

別の方法 (前の方法よりも優れているようです) は、フィールドとプロパティをそれぞれデータベース テーブルpostsとモデルに追加Postして、Post の一意の識別子 (たとえば、いくつかのハッシュ) を格納することidです (確実ではありません)。投稿は現時点ではまだ存在しません。たとえば、ハッシュされたタイムスタンプである可能性があります)。次に、非表示の入力フィールドをフォームに追加し、その値をその一意の識別子に設定します。このようにして、ユーザーが [戻る] ボタンを押すと、その識別子が既存の投稿に既に設定されているフォームに移動し、2 回目にフォームを送信した後、その一意の識別子で投稿を見つけて更新することができます。

于 2013-06-14T09:30:01.180 に答える