我的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
答案 0 :(得分: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消息,避免呈现两次
答案 1 :(得分:1)
我也遇到了同样的问题,也是由于我在检查<%= render 'shared/alerts' %>
之后又打了flash
。我喜欢@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>
答案 2 :(得分:0)
只要把它放在这里给其他有麻烦的人。
我有两次Flash消息,因为我在application.html.erb
中有一些内容告诉我的应用程序显示Flash消息,但是我以前使用rails generate scaffold posts
等生成了视图,因此已经将Flash消息自动添加到了所有视图。
所以解决方案是将它们从视图中删除。
Here是一个很棒的教程,演示了仅针对一个模型/视图的删除
所以基本上,如果您的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>