簡體   English   中英

在 Rails 中出現兩次 Flash 消息

[英]Flash messages appearing twice in rails

我的 flash 消息出現了兩次,我的網絡研究告訴我這是由於呈現和重定向顯示消息。 我想我需要在某處使用 flash.now[] 或 flash[] 來對此進行排序,但我無法弄清楚它需要去哪里

guidelines_controller.rb

def update
  @guideline = Guideline.find(params[:id])

  respond_to do |format|
    if @guideline.update_attributes(params[:guideline])
      @guideline.update_attribute(:updated_by, current_user.id)
      format.html { redirect_to @guideline, notice: 'Guideline was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: "show" }
      format.json { render json: @guideline.errors, status: :unprocessable_entity }
    end
  end
end

布局/application.html.erb

<div class="container">

    <% flash.each do |type, message| %>

        <div class="alert <%= flash_class type %>">
            <button class="close" data-dismiss="alert">x</button>
            <%= message %>
        </div>
    <% end %>
</div>

application_helper.rb

def flash_class(type)
  case type
  when :alert
    "alert-error"
  when :notice
    "alert-success"
  else
    ""
  end
end

guideline_controller.rb

def show
    @guideline = Guideline.find(params[:id])
    if @guideline.updated_by
     @updated = User.find(@guideline.updated_by).profile_name
   end

      if User.find(@guideline.user_id)
     @created = User.find(@guideline.user_id).profile_name
      end

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @guideline }

    end
  end

您可以這樣做以節省一些代碼行,並只顯示一次消息:

<%- if flash.any? %>
  <%- flash.keys.each do |flash_key| %>
    <%- next if flash_key.to_s == 'timedout' %>
    <div class="alert-message <%= flash_key %>">
      <a class="close" data-dismiss="alert" href="#"> x</a>
      <%= flash.discard(flash_key) %>
    </div>
  <%- end %>
<%- end %>

通過使用 flash.discard,您可以顯示 flash 消息並避免渲染兩次

只是把這個放在這里給其他有麻煩的人。

我的 flash 消息出現了兩次,因為我在application.html.erb有一些東西告訴我的應用程序顯示 flash 消息,但是我之前已經用rails generate scaffold posts等生成了視圖,所以它自動將 flash 消息添加到所有視圖中。

所以解決方案是將它們從視圖中刪除。

是一個很棒的教程,演示了僅針對一個模型/視圖的刪除

所以基本上,如果你的application.html.erb有這樣的東西:

<% if notice %>
  <p class="alert alert-success"><%= notice %></p>
<% end %>
<% if alert %>
  <p class="alert alert-danger"><%= alert %></p>
<% end %>

然后簡單地從每個視圖中刪除等效項。 即從每個視圖的頂部刪除此行

<p id="notice"><%= notice %></p>

我也遇到了同樣的問題,也是由於在我檢查flash之后又調用了<%= render 'shared/alerts' %> 我喜歡@做的rorra的想法flash_key 但是在 2020 年,它並沒有像 @tessad 所說的那樣工作。 它會顯示消息,但不會在引導程序中正確格式化。

我能夠將他們的代碼更改為與 BootStrap 4 一起使用。它甚至可以按預期進行處理。 需要改變的三件事都是處理用於顯示flash通知的div的類。

<div class="alert-message <%= flash_key %>">

alert-message變得只是alert ,而flash_key必須有alert-之前。

<div class="alert alert-<%= flash_key %>">

最后一件事是我將它作為flash[:notice]從控制器發送到視圖,這不是公認的引導程序警報。 當我將其更改為flash[:warning]它顯示正確。

這是對我有用的最終代碼。 把它放在這里以防萬一有人在給出初始答案 7 年后現在需要它。

<div id="container">
<%- if flash.any? %>
  <%- flash.keys.each do |flash_key| %>
    <%- next if flash_key.to_s == 'timedout' %>
    <div class="alert alert-<%= flash_key %>">
      <a class="close" data-dismiss="alert" href="#"> x</a>
      <%= flash.discard(flash_key) %>
    </div>
  <%- end %>
<%- end %>
</div>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM