web-dev-qa-db-ja.com

Devise / Rails-特定のフラッシュメッセージを削除する方法(正常にサインインしました)

Deviseを使用して、特定のフラッシュメッセージを削除する方法があるかどうか知りたいですか? (正常にサインイン)。

ビュー内の他のメッセージが気になるので、サインインしたメッセージとサインアウトしたメッセージだけです。コントローラを上書きする必要がありましたか、それとも別の方法がありますか?

ありがとうございました!

39
benoitr

ローカルファイルの空の文字列に定義するだけです。この場合、何も表示されません。

60
shingara

OK!

Shingaraが言ったように、私はdevise.en.ymlで空の文字列を定義します

sessions:
  signed_in: ''

また、次の行を少し変更します(nifty-generatorsによって提供されます)。

<% flash.each do |name, msg| %>
  <%= content_tag :div, msg, :id => "flash" if msg.length > 0 %>
<% end %>

そのように、私のcssは表示されません。

40
benoitr

ロケールファイルの文字列を空にします(上記で提案したように)が、非表示にする次のCSSスニペットも追加します(フラッシュビューでモンキーする代わりに)

.flash.alert:empty {
  display: none;
}
9
Sean Schofield

これを行うもう1つの柔軟な方法は、アクションの後に通知の設定を解除することです。

class SessionsController < Devise::SessionsController
  after_action :remove_notice, only: :destroy

  private

  def remove_notice
    flash[:notice] = nil
  end
end

このソリューションを使用すると、通知を削除するかどうかに条件を追加できます。

9
Sunny

もう1つの方法は、Deviseコントローラーをオーバーライドする場合、作成アクションで次のコードを入力します。これにより、フラッシュメッセージが削除されます。

class MyDevise::SessionsController < Devise::SessionsController

  # POST /resource/sign_in
  def create
    super
    flash.delete(:notice)
  end

  # DELETE /resource/sign_out
  def destroy
    super
    flash.delete(:notice)
  end

end

これはこの他で答えられましたSO質問。 Deviseコントローラをオーバーライドする方法に関するブログ投稿については、 私のブログ投稿 を参照してください

5
andrewcockerham

私の観点からは、コントローラーの動作を簡単に変更できるので、文字列変換を空にすることの意味はわかりません。この方法の方がはるかに正確で満足のいくものだと思います。

より良い答えは、sessionControllerのdestroyメソッドをオーバーライドすることです。

App/controllers /sessions_controller.rbに配置されたファイルを作成するだけです

ご覧のとおり、フラッシュメッセージを作成する行にコメントを付けています。

class SessionsController < Devise::SessionsController 
  # DELETE /resource/sign_out
  def destroy
    signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
    #set_flash_message :notice, :signed_out if signed_out && is_flashing_format?
    yield if block_given?
    respond_to_on_destroy
  end
end
3
fhidalgo

config/locals/devise.en.ymlのエラーメッセージを空の文字列に変更すると、自動的に無視されることをdeviseが理解したと思います。少なくともそれが私と一緒に働いたものです。

2
omarwaleed

これを行うことができます。それに応じて、条件タイプとフラッシュタイプを変更してください。

flash.delete(:alert)if flash [:alert] == "続行する前にサインインまたはサインアップする必要があります。" @drivers = params [:keyword] .blank? ? []:Driver.find(params [:keyword])

フィルター前にそれを行うことができます。

0
shiva kumar