使用以下内容呈现操作:通​​知取决于URL参数

时间:2012-06-27 04:34:57

标签: ruby-on-rails ruby-on-rails-3

我有一个操作“批准”,它会呈现一个显示模型(类)内容的视图。在视图中,我有一个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

3 个答案:

答案 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