0

アプリの基本的な認証/ログインを設定していますが、マイナーな問題ではありますが厄介な問題に遭遇しました。

以下は私の「作成」方法です:

def create
    @user = User.new(user_params)

    if @user.save
      flash[:notice] = "You signed up successfully"
      flash[:color]= "valid"
    else
      flash[:notice] = "Form is invalid"
      flash[:color]= "invalid"
    end

    render "index"
end

インデックスをレンダリングすると、フォームが無効になることがあり、サインアップに成功したこともあります。データがデータベースに正常に追加された場合でも、フォームが無効になることがあります。

<% if flash[:notice] %>
<div class="notice"><%= flash[:notice] %></div>
4

2 に答える 2

0

2つのことがあります。

まず、どのようにflash機能するかを見てください。何かを置くと、次のリクエストが完了するまでそこにとどまります。

flash[:foo] = 'bar'
flash[:foo] #=> 'bar' 

# redirect the user or reload of the page
flash[:foo] #=> 'bar' 

# redirect the user or reload of the page
flash[:foo] #=> nil

同じリクエスト内で表示されるべきであるが、次のリクエストでは表示されないエラー メッセージについては、now

flash.now[:foo] = 'bar'
flash[:foo] #=> 'bar' 

# redirect the user or reload of the page
flash[:foo] #=> nil

さらに読む: http://edgeguides.rubyonrails.org/action_controller_overview.html#the-flash

別のこと: データの get 要求を処理するだけでなく (作成、更新、削除の代わりに)、その操作が成功した後にユーザーをリダイレクトしてください。別のビューをレンダリングするだけではありません。その理由は、ユーザーがページをリロードすると、ブラウザーが最後の要求を再送信するためです。そして-あなたの場合-同じデータで2番目のユーザーを作成してみてください。

tldr:saveうまくいかなかった場合はrender、フォームをもう一度。saveが成功した場合は、redirectユーザーにshowまたはindex

于 2013-09-14T07:35:20.283 に答える
0

その理由は、renderの代わりに使用したためですredirect_to

flashセッションに保存され、次のリクエストでのみ有効になるものです。

コントローラーでは、リクエストは 1 つだけです。フラッシュはまだセッションに保存されている古い情報であり、render更新されません。

render修正するには、次のものに置き換えますredirect_to

于 2013-09-14T07:20:41.150 に答える