我在Rails控制器中有以下代码:
flash.now[:notice] = 'Successfully checked in'
redirect_to check_in_path
Run Code Online (Sandbox Code Playgroud)
然后在/ check_in视图中:
<p id="notice"><%= notice %></p>
Run Code Online (Sandbox Code Playgroud)
但是,通知没有显示出来.如果我不在控制器中重定向,则工作完美:
flash.now[:notice] = 'Successfully checked in'
render action: 'check_in'
Run Code Online (Sandbox Code Playgroud)
我需要重定向...而不仅仅是对该动作的渲染.重定向后可以有闪光通知吗?
ruby-on-rails rails-flash ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-4
我正在编写一个rails 4.0.2应用程序,并且我试图在AJAX事件之后在我的视图中显示Flash通知.
在我看来,我会显示一个日历,其中包含用户可以点击的日期.当他们这样做时,我通过onclick事件处理程序触发一个AJAX事件,该处理程序更新我的模型,添加或删除记录.触发事件后,我完成页面刷新以显示更新的结果.
我发现在JS点击事件期间我必须刷新页面才能使视图正确更新.仅在控制器中重定向或渲染是不够的.
所以,为此,我在控制器中设置了Flash通知...
def set_conflicts
@conflict = @member.conflicts.for_date(params[:date]).first
if @conflict
@conflict.destroy
else
conflict_date = Date.parse(params[:date])
unless Conflict.create(
month: conflict_date.month,
day: conflict_date.day,
year: conflict_date.year,
member: @member
)
flash[:alert] = 'Oops, there was a problem updating conflicts'
end
end
flash[:notice] = 'This is a test!'
redirect_to manage_member_conflicts_path(@member)
end
Run Code Online (Sandbox Code Playgroud)
...并在我的application.haml中包含以下flash显示逻辑...
...
%body
= p flash.inspect
- flash.each do |type, message|
= content_tag(:div, message, :class => "flash-#{type}")
= render 'devise/menu/login_items'
= yield
Run Code Online (Sandbox Code Playgroud)
注意:我在视图中使用HAML而不是ERB
然而,无论我尝试什么,Flash消息都不会显示.除了flash消息之外,其他所有工作都按预期工作,我无法弄清楚原因. …
我试图在模型观察者中为flash [:notice]分配一条消息.
这个问题已经被问到:Ruby on Rails:Observers和flash [:notice]消息?
但是,当我尝试在我的模型中访问它时,我收到以下错误消息:
undefined local variable or method `flash' for #<ModelObserver:0x2c1742c>
这是我的代码:
class ModelObserver < ActiveRecord::Observer
observe A, B, C
def after_save(model)
puts "Model saved"
flash[:notice] = "Model saved"
end
end
Run Code Online (Sandbox Code Playgroud)
我知道正在调用该方法,因为"模型保存"被打印到终端.
是否有可能在观察者内部访问闪存,如果是这样,怎么办?
在我看来,我有:
<% flash.now[:error] = "ERROR FLASH" %>
<% flash.now[:notice] = "NOTICE FLASH" %>
<% flash.now[:warning] = "WARNING FLASH" %>
Run Code Online (Sandbox Code Playgroud)
页面渲染时,只显示带有NOTICE FLASH的蓝色信息框.其他两个将不会显示.同样的事情发生在等号上:
<%= flash.now[:error] = "ERROR FLASH" %>
<%= flash.now[:notice] = "NOTICE FLASH" %>
<%= flash.now[:warning] = "WARNING FLASH" %>
Run Code Online (Sandbox Code Playgroud)
我的rails应用程序中是否有设置警告或错误闪烁未出现?
我正在为某些控制器操作执行此类操作:
def my_method
flash[:notice] = "Success."
respond_to do |format|
format.js { render 'common/flashes' }
end
end
Run Code Online (Sandbox Code Playgroud)
而且效果很好,并且闪光警报和通知显示得很好。但是,当用户单击以转到另一页时,该Flash消息将再次显示。由于我处理它们的方式,Rails显然不知道使用了它们。完成上面的渲染后,如何清除它们?
使用Rails 3.0.3结合设计之类的宝石我没有得到任何flash消息.现在我提到设计,因为它控制用于验证我的cookie.
现在Rails应用程序有点特殊,因为它使用子域.他们所做的是告诉应用程序用户正在浏览哪家公司.例如:mycompany.theapp.com/projects/3/ < - 公司"mycompany"的项目3.
当用户登录时,他/她被定向到theapp.com/overview < - 非子域
每次通知都会显示,那么为什么不在子域页面上?
所以这是子域页面上使用的代码.与将其放在非子域页面上的完全相同.控制器中的代码:
def update
redirect_to [@project], :notice => "Project #{@project.name} updated."
end
Run Code Online (Sandbox Code Playgroud)
layouts/application.html.erb
<% flash.each do |type, message| %>
<%= content_tag :div, message, :class => "flash #{type}" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我还添加了以下内容,试图弄清楚发生了什么:
flash.to_yaml
# Result: --- !map:ActionDispatch::Flash::FlashHash {}
Run Code Online (Sandbox Code Playgroud)
由于显然设计使用flash [:notice]我也尝试过(因为那是为了设计).
flash[:notice] = "Project #{@project.name} updated."
# Result: --- !map:ActionDispatch::Flash::FlashHash {}
Run Code Online (Sandbox Code Playgroud)
现在,通知是否会通过cookie或会话数据发送,而这些数据不能很好地传输到子域?因为该项目的编辑形式在mycompany.theapp.com/projects/3/edit/上
,它将我发送到mycompany.theapp.com/projects/3/(不另行通知)
它发生在带有"rails服务器"的Ubuntu 10.10上,乘客使用nginx,甚至在Mac机器上(但有人测试过).
有人在乎猜?
我使用了生成我的设计视图 rails g devise:views users
我使用了生成我的设计控制器 rails g devise:controllers users
我添加了我的新控制器routes.rb
:
devise_for :users, controllers: { sessions: "users/sessions",
confirmations: "users/confirmations",
registrations: "users/registrations",
passwords: "users/passwords",
unlocks: "users/unlocks"}
Run Code Online (Sandbox Code Playgroud)
根据这个答案,我改变了我的flash消息来处理Arrays:rails - Devise - Handling - devise_error_messages
像这样:
<% flash.each do |key, value| %>
<% if value.class == Array %>
<% value.each do |message| %>
<div class="<%= flash_class(key) %>">
<%= message %>
</div>
<% end %>
<% else %>
<div class="<%= flash_class(key) %>">
<button type="button" class="close" data-dismiss="alert">×</button>
<%= value %>
</div>
<% …
Run Code Online (Sandbox Code Playgroud) ruby-on-rails devise rails-flash ruby-on-rails-3 devise-confirmable
我有一个表单的创建操作可能会产生错误(即缺少名字),然后重定向.
问题是,当重定向发生时,那些形式错误就会丢失.我怎样才能在会话中传递这些表单错误以原始形式显示(仍应填写之前的详细信息,如原始的error_messages行为)?
谢谢!
代码:
def create
@contact = Contact.new(params[:contact])
if @contact.save
flash[:notice] = "Sent."
else
flash[:notice] = "Error."
end
end
Run Code Online (Sandbox Code Playgroud) rails-flash ×8
devise ×2
activerecord ×1
ajax ×1
forms ×1
javascript ×1
session ×1
subdomain ×1