在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)
答案 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;还有很多其他选项和方法可以保持代码干燥和可维护。