我正在AJAX化一个现有的Rails 3.2应用程序,从客户端发出的一些请求最好异步完成。为了促进这一点,并减少渲染时间,我通过警报向用户提供反馈。我在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惯例或规则?此外,有没有一种方法可以代替responsd_with来做这件事?我看不出如何从一行中进行两种不同类型的渲染。
-
如果正在渲染的
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
错误。如果你想解决这个问题,你必须在格式中添加一些约束。 -
但是,如果您的操作也响应
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)返回一些资源。这篇文章更详细一些。
respond_to do |format|
format.js
end
我看你的控制器侧面没有问题。
在.js.erb 中进行格式转换时,请确保使用escape_javascript