我有一个操作“批准”,它会呈现一个显示模型(类)内容的视图。在视图中,我有一个link_to,它使用URL参数(:id)调用accept
。在accept
操作完成后(将批准设置为true),我想再次使用消息(“已保存!”)呈现approval
。但是,与静态登录页面不同,批准操作在第一次调用时需要一个参数。第二次渲染时,会发生运行时错误(显然)。使用Flash通知调用approval
的最佳方法是什么?
def approval
@c = Class.find(params[:id])
end
def accept
@c = Class.find(params[:id])
@c.approve = true
@c.save
render 'approval', :notice => "Saved!"
end
答案 0 :(得分:7)
将此render 'approval', :notice => "Saved!"
更改为
flash[:notice] = "Saved!"
redirect_to :back
答案 1 :(得分:3)
您可以使用FlashHash#now
设置当前操作的通知
flash.now[:notice] = 'Saved !'
render 'approval'
http://api.rubyonrails.org/classes/ActionDispatch/Flash/FlashHash.html#method-i-now
答案 2 :(得分:2)
例外:http://www.perfectline.ee/blog/adding-flash-message-capability-to-your-render-calls-in-rails
现在控制器中的常见模式如下所示:
if @foo.save
redirect_to foos_path, :notice => "Foo saved"
else
flash[:alert] = "Some errors occured"
render :action => :new
end
我希望能够做到的是:
if @foo.save
redirect_to foos_path, :notice => "Foo saved"
else
render :action => :new, :alert => "Some errors occured"
end
添加此功能实际上非常简单 - 我们只需要创建一些扩展渲染功能的代码。 下一段代码实际上扩展了包含重定向调用功能的模块。
module ActionController
module Flash
def render(*args)
options = args.last.is_a?(Hash) ? args.last : {}
if alert = options.delete(:alert)
flash[:alert] = alert
end
if notice = options.delete(:notice)
flash[:notice] = notice
end
if other = options.delete(:flash)
flash.update(other)
end
super(*args)
end
end
end