在像这样的控制器动作中使用respond_to块有什么问题吗?

时间:2013-02-06 21:36:46

标签: ruby-on-rails-3 coding-style ruby-on-rails-3.2 convention-over-configur

我是一个现有的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?我无法看到我如何从一行进行两种不同类型的渲染。

2 个答案:

答案 0 :(得分: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错误。如果您想解决此问题,则必须add some constraints格式化。

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

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

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

    < / LI>
  4. 使用respond_with块渲染不同的文件不适用于您的情况,因为您只渲染了一些javascript。 respond_with用于以各种格式(html,json,xml)返回一些资源This article更详细一点。

答案 1 :(得分:2)

respond_to do |format|
    format.js 
end

我发现控制器侧面没有任何问题。

请务必在.js.erb

中进行rending时使用escape_javascript