【问题标题】:Rails multiple render calls for ajax requestsRails 对 ajax 请求的多次渲染调用
【发布时间】:2011-12-11 22:47:42
【问题描述】:

我正在开发一个 Rails 应用程序,在该应用程序中,我想使用 JSON 对象响应 ajax 请求,该对象包含我通过查询数据库在 Rails 控制器中设置的实例变量以及呈现的视图(使用没有模板)。我正在通过以下方式使用after_filter 来完成此操作:

after_filter :handle_ajax
def handle_ajax

  respond_to do |format|

    format.html
    format.json do
      data = {}

      instance_variables.each {|iv| data[iv] = instance_variable_get(iv) }
      data[:url] = request.path
      #data[:html] = render_to_string :action => params[:action], :template => false

      render :json => data
    end

  end

end

但是,当我使用它时,Rails 抱怨我调用了两次render(或者在本例中为render 和render_to_string)。这不是处理 ajax 请求的正确方法吗?我对 Rails 比较陌生,所以这很可能不是 RoR 的做事方式。

【问题讨论】:

  • 尝试render_to_string 部分

标签: ruby-on-rails ruby ajax ruby-on-rails-3 json


【解决方案1】:

Rails 调用会为每个动作自动渲染,你可以试试:

def index
  @tracks = @artist.tracks.find(:all, :limit => 10)
  render :nothing => true
end

编辑(我认为这实际上行不通):我会推荐类似的东西:

def index
  @tracks = @artist.tracks.find(:all, :limit => 10)
  handle_ajax :tracks => @tracks
end


def handle_ajax data
  respond_to do |format|

    format.html
    format.json do
      data[:url] = request.path

      render :json => data
    end
end

结束

【讨论】:

  • 对于任何试图做类似这样的事情的人:当您响应 html 以外的任何其他格式时,Rails 会尝试根据该内容类型查找模板,因此当您尝试时它通常会抱怨在 json 块中渲染一个 html 模板。解决这个问题的方法是在 format.json do ... end 块的顶部添加 self.formats = ['html']
【解决方案2】:

您的其他控制器方法很可能也在渲染它们自己的方法。您只能调用一个渲染。控制器的其余部分是什么样的?

【讨论】:

  • 其他动作不调用渲染,它们基本上只是从 ActiveRecord 查询中创建实例变量。例如:def index @tracks = @artist.tracks.find(:all, :limit => 10) end我是否需要在动作中调用某些东西来告诉 Rails 不要自动呈现该动作的默认视图?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2022-08-19
  • 2013-01-27
  • 2018-08-12
  • 2011-11-10
  • 1970-01-01
相关资源
最近更新 更多