2

我正在对现有的 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 来代替?我看不到如何从一行中进行两种不同类型的渲染。

4

2 回答 2

4
  1. 如果js您正在渲染的文件与控制器的操作具有相同的名称,则不需要respond_to块。

    但是,由于您将js文件放在一个公共文件夹中,为了在您的控制器之间重用,您必须明确告诉 Rails 渲染该文件。这完全没问题。

  2. 如果您的操作仅响应js,则可以使用括号而不是do ... end块来使其成为单行:

    respond_to { |format| format.js }
    

    但是,由于您必须指定js文件的名称,这可能会变得非常难看,因此您可以省略该respond_to块并执行以下操作:

    render 'common/flashes'
    

    然而,这带来的不便是,如果您的控制器收到html请求,它将搜索flashes.html公共文件夹内命名的文件。这很可能会返回Template is missing错误。如果要解决此问题,则必须为格式添加一些约束。

  3. 但是,如果您的操作也响应html,那么您应该像这样声明该块:

    respond_to do |format|
      format.html
      format.js { render 'common/flashes' }
    end
    

    您不需要format.html,但是当您查看代码时,您可以立即看出它同时响应htmljs请求。

  4. 使用respond_with块来呈现不同的文件不适用于您的情况,因为您只呈现一些 javascript。respond_with用于以各种格式(html、json、xml)返回一些资源这篇文章更详细一点。

于 2013-02-19T11:17:15.487 回答
2
respond_to do |format|
    format.js 
end

我从您的控制器方面看没有问题。

请务必在 .js.erb 中渲染时使用 escape_javascript

于 2013-02-15T04:00:10.253 回答