Ruby on rails Rails-DRY机制将flash消息呈现为JSON响应

Ruby on rails Rails-DRY机制将flash消息呈现为JSON响应,ruby-on-rails,dry,Ruby On Rails,Dry,我的应用程序中有一个非常基本的API,它还有一个索引页,允许测试/演示各种API函数 由于有了这个索引HTML页面,所有函数都应该能够响应HTML(它只是用附加的flash消息重新呈现索引页面)或JSON(它只是发送回一个简单的状态/消息对象) 每个函数当前看起来有点像这样 def do_stuff if params['stuff'] begin Helper.do_stuff params['stuff'] rescue Exception => e

我的应用程序中有一个非常基本的API,它还有一个索引页,允许测试/演示各种API函数

由于有了这个索引HTML页面,所有函数都应该能够响应HTML(它只是用附加的flash消息重新呈现索引页面)或JSON(它只是发送回一个简单的状态/消息对象)

每个函数当前看起来有点像这样

def do_stuff

  if params['stuff']

    begin
      Helper.do_stuff params['stuff']
    rescue Exception => ex
      msg = ex.message
      status = 'error'

      flash[:error] = msg
    else
      msg = 'Stuff done'
      status = 'success'

      flash[:success] = msg
    end

  else
    msg = 'No stuff provided'
    status = 'error'

    flash[:error] = msg
  end

  respond_to do |format|
    format.html { render 'api/index' }
    format.json do
      render json: {:status => status, :message => msg}
    end
  end
end
人们会推荐什么来干燥这个?从flash散列中构造JSON状态对象似乎是一件好事


我在想,要么使用助手,要么使用逻辑从JSON布局解析flash散列,这样会更优雅吗?

我发现直接为JSON响应呈现flash散列就足够了

def do_stuff
  if params['stuff']

    begin
      Helper.do_stuff params['stuff']
    rescue Exception => ex
      flash[:error] = msg
    else
      flash[:success] = 'Stuff done'
    end

  else
    flash[:error] = 'No stuff provided'
  end

  respond_to do |format|
    format.html { redirect_to :action => 'index' }
    format.json do
      render json: flash
    end
  end
end

在将其呈现为json之前,您可能需要在flash上调用
to_hash
方法。在某些版本的rails中,
flash.to_json
实际上并不返回json哈希

def do_stuff
  respond_to do |format|
    format.html { redirect_to :action => 'index' }
    format.json do
      render json: flash.to_hash
    end
  end
end