ruby on rails 3-在这样的控制器操作中使用respons_to块有问题吗



我正在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来做这件事?我看不出如何从一行中进行两种不同类型的渲染。

  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)返回一些资源。这篇文章更详细一些。

respond_to do |format|
    format.js 
end

我看你的控制器侧面没有问题。

在.js.erb 中进行格式转换时,请确保使用escape_javascript

相关内容

  • 没有找到相关文章

最新更新