如何为ajax请求写DRY flash消息?

时间:2017-08-08 02:26:53

标签: ruby-on-rails ajax

在ajax请求后向用户显示消息的最佳方式(即最易维护,干燥)是什么?

显然,为单个JS控制器操作实现此操作的最简单方法是使用关联的JS partial。例如,

#create.js
$('.flash-container').html('<p>SUCCESS!</p>');

但是,如果应用程序包含大量的ajaxed操作,则很快就会变得无法维护,如果需要进行更改,则需要更新许多部分内容。

我目前使用的方法如下。但这总是看起来非常脆弱,而且很讨厌&#39; hacky&#39; - 我必须忽略Rails惯例?

第一次在页面上触发ajax请求时返回That page doesn't exist!。所有后续请求都会返回预期结果,直到重新加载页面。到底是怎么回事?

#my_controller.rb
def create
  if @object.save
    format.js   { flash[:notice] =  t('.notice') }
  else 
    format.js   { flash[:error] =  t('.error') }
  end
end
# application_controller.rb
after_action :flash_to_headers
def flash_to_headers
  return unless request.xhr?
  response.headers['X-Message'] = flash_message
  response.headers["X-Message-Type"] = flash_type.to_s
  flash.discard 
end
def flash_message
  [:alert, :error, :notice, :success].each do |type|
    return flash[type] unless flash[type].blank?
  end
  return nil
end

def flash_type
  [:alert, :error, :notice, :success].each do |type|
    return type unless flash[type].blank?
  end
  return :empty
end

#flash.js.coffee

$(document).ajaxComplete (event, request) ->

  msg   = request.getResponseHeader("X-Message")
  type  = request.getResponseHeader("X-Message-Type")

  if msg
    alert(msg)

1 个答案:

答案 0 :(得分:0)

为什么不将你的js partial更改为js.erb partial并在将其解析为标准js而不是通过标题发送之前嵌入你要发送的消息?

以与.html.erb文件相同的方式,您也可以拥有.js.erb文件:

a

在保持可维护性和干燥性方面,这只是代码设计,创建一个共享的js.erb部分,你在其他.js.erb parials中渲染:

b

在顶级控制器中创建共享helper_method:

# create.js.erb
<% if flash[:notice] %>
$('.flash-container').html('<p><%= flash[:notice] %></p>');
<% end %>

你可以提取一个ServiceObject处理程序,或者如果你进入DDD就可以使用#shared/_ajax_messages.js.erb <% if flash[:notice] %> $('.flash-container').html('<p><%= flash[:notice] %></p>'); <% end %> <% if flash[:error] %> $('.flash-container').html('<p><%= flash[:error] %></p>'); <% end %> # create.js.erb <%= render(partial: 'ajax_messages') %> # some_controller.rb helper_method :handle_ajax_messages # create.js.erb $('.flash-container').html('<p><%= handle_ajax_messages %></p>'); #to_html等方法创建自定义的NoticeObjects或Value Objects来保存DRY适用于所有类型的请求。如果你突破一些所谓的&#34; Rails约定&#34;还有很多其他选项和方法可以保持代码干燥和可维护。