我是一个现有的Rails 3.2应用程序的AJAX化,并且从客户端发出的一些请求最好是异步完成的。为了促进这一点,并减少渲染时间,我通过警报向用户提供反馈。我在application.html.erb文件中有一个空白div,我根据需要从某些控制器操作添加警报,如下所示:
def my_async_controller_action
@user = User.find(params[:id])
begin
#@user.import
flash[:notice] = "Your data is being downloaded."
rescue Exception => bang
flash[:alert] = "There was an error downloading your data: #{bang.message}"
end
respond_to do |format|
format.js { render 'common/flashes' }
end
end
我的common/flashes
文件只使用jQuery来append
对空白div的警报。虽然它工作正常,但我从未见过这样的警报,只能通过重定向。是否有任何未写入(或书面)的Rails惯例或规则,我采取这种方法打破了?另外,有没有办法将此作为respond_with?我无法看到我如何从一行进行两种不同类型的渲染。
答案 0 :(得分:4)
如果您呈现的js
文件与控制器的操作同名,则不需要respond_to
块。
但是,由于您将js
文件放在公共文件夹中,要在控制器之间重用,您必须明确告诉Rails呈现该文件。这完全没问题。
如果您的操作仅响应js
,则您可以使用括号而不是do ... end
块来使其成为单行:
respond_to { |format| format.js }
但是,由于您必须指定js
文件的名称,这可能会非常难看,因此您可以省略respond_to
块并执行以下操作:
render 'common/flashes'
但是,如果您的控制器收到html
请求,它会在公共文件夹中搜索名为flashes.html
的文件,这样做很不方便。这很可能会返回Template is missing
错误。如果您想解决此问题,则必须add some constraints格式化。
但是,如果您的操作也响应html
,那么您应该像这样声明块:
respond_to do |format|
format.html
format.js { render 'common/flashes' }
end
您不需要format.html
,但是当您查看代码时,您可以立即告诉它它会响应html
和js
个请求。
使用respond_with
块渲染不同的文件不适用于您的情况,因为您只渲染了一些javascript。 respond_with
用于以各种格式(html,json,xml)返回一些资源。 This article更详细一点。
答案 1 :(得分:2)
respond_to do |format|
format.js
end
我发现控制器侧面没有任何问题。
请务必在.js.erb
中进行rending时使用escape_javascript