8

我的 flash 消息出现了两次,我的网络研究告诉我这是由于渲染和重定向显示消息。我想我需要在某处使用 flash.now[] 或 flash[] 对其进行排序,但我无法确定它需要去哪里

指南控制器.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
4

3 回答 3

2

您可以这样做以节省一些代码行,并只显示一次消息:

<%- 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 消息并避免渲染两次

于 2013-03-04T01:31:31.557 回答
2

只是把这个放在这里给其他有麻烦的人。

我有两次闪现消息,因为我有一些东西application.html.erb告诉我的应用程序显示闪现消息,但我之前使用rails generate scaffold postsetc 生成了视图,因此自动将闪回消息添加到所有视图中。

所以解决方案是将它们从视图中删除。

是一个很棒的教程,演示了仅删除一个模型/视图

所以基本上,如果你有这样的东西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>
于 2020-09-11T14:58:49.347 回答
1

我也有同样的问题,也是由于<%= render 'shared/alerts' %>我检查后的另一个电话flash。我喜欢@rorra 的想法flash_key。但是在 2020 年,它并没有像 @tessad 所说的那样工作。它会显示消息,但不能正确格式化引导程序。

我能够更改他们的代码以与 BootStrap 4 一起使用。它甚至会按原样解散。需要改变的三件事都是处理用于显示flash通知的div的类。

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

alert-message变为 just alert,并且flash_key必须alert-在它之前拥有。

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

最后一件事是我将它从控制器发送到视图 as 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>
于 2020-06-07T04:52:56.480 回答