【问题标题】:Sorting via AJAX with Rails使用 Rails 通过 AJAX 进行排序
【发布时间】:2018-12-01 17:54:42
【问题描述】:

我正在尝试更新 Ajax 的想法列表并不断获取未知格式。我有这张桌子:

我正在尝试根据过滤器进行排序。我的家庭控制器中有这个:

  def sortable
    type = params[:type]
    case type
      when "Recent"
        @my_ideas = @my_ideas.ideas.sort_by(&:created_at)
      when "Less Price"
        @my_ideas = @my_ideas.ideas.order('price asc')
      when "Higher Price"
        @my_ideas = @my_ideas.ideas.order('price desc')
    end
  end

在js文件中:

$('#filter_content p').on('click',function(){
    $('#filter_content').animate({
        height: 0
    }).addClass('open');
    $('#ideas .item').fadeOut().fadeIn();
    var type = $(this).text();
        $.ajax({
            url: 'home/sortable',
            type: 'GET',
            data: type,
            format: 'js'
        })
})

我最初有一个 response_to do |format| format.js 在我的可排序方法中,但没有用。有人有任何提示吗?

【问题讨论】:

  • 尝试动态刷新列表并显示已排序的项目
  • 到底是什么问题?看起来你在排序后什么也没做。您应该将 @my_ideas 返回给 js,然后使用新顺序重新渲染

标签: javascript ruby-on-rails ajax


【解决方案1】:

发出 JavaScript 请求的 jQuery.ajax 选项是 dataType: 'script',而不是 format: 'js'

http://api.jquery.com/jquery.ajax/

在 Rails 中使用 JavaScript 作为响应类型,您必须有一个响应 JS 的操作(没有 respond_to 块,我相信默认情况下会这样做)并且您必须有一个 JavaScript 响应文件(又名 app/views/home/sortable.js.erb )。

响应 sortable.js.erb 将被发送到浏览器而不是新页面。

你的动作看起来不错,正在排序。但是现在,我们需要在sortable.js 中编写代码,将新的 HTML 插入到网页的元素中。

例如(假设元素 id-ed #ideas 和部分 app/views/ideas/_idea.html.erb):

# app/views/home/sortable.js.erb
$('#ideas').html('<%= j render @my_ideas %>')

上面的代码将渲染集合,使用每个idea的部分到浏览器接收的JS代码中。

这样,Ajax请求出去了,JS回来了,页面没有重新加载。

否则,正如其他人所指出的,不要使用 AJAX,只需将您的下拉菜单变成指向同一页面的链接。

【讨论】:

  • 出于某种奇怪的原因,我的 type = params[:type] 返回 nil
  • 那是因为你的请求正文看起来像这样{"Recent"},而你的控制器期望{type:"Recent"}。自己检查一下 :) 你需要做 type = { type: $(this).text() },这样 Rails 可以从 params[:type] 读取数据。
  • 我认为我正在接近但我收到此错误:VM50473:1 Uncaught SyntaxError: missing) 在函数的 DOMEval (jquery.self-355640b….js?body=1:83) 的参数列表之后.globalEval (jquery.self-355640b….js?body=1:349) at text script (jquery.self-355640b….js?body=1:9577) at ajaxConvert (jquery.self-355640b….js?body =1:8725) 在完成 (jquery.self-355640b....js?body=1:9193) 在 XMLHttpRequest. (jquery.self-355640b....js?body=1:9485) 不确定是不是因为sortable.js.erb 的
  • 糟糕,我在sortable.js.erb 代码中犯了一个错误。它是j render,而不是render j,其中jescape_javascript 的简写。这意味着 ERB 不会被解释为文件行,这将是 HTML 中的换行符的问题。相反,换行符被转义为字符串。
  • 谢谢。我觉得如此接近它令人沮丧。我不再有任何错误,我已经放了一个 p 来查看该方法是否真的在更新变量 @my_ideas 并且看起来是这样,但它没有更新页面上的部分内容。我有这个:
【解决方案2】:

您应该在您的 URL 上添加 .js,以便您的响应被处理为 JS,而不是纯文本。

$.ajax({
  url: 'home/sortable.js',
  type: 'GET',
  data: type,
  dataType: 'js'
})

【讨论】:

  • 我认为执行请求的正确方法是使用 JQuery.ajax 中的 dataType 选项。虽然我怀疑 Rails 仍然认为这是一个 JS 请求,所以你没有错。
  • 是的,我最近遇到了类似的问题,只是解决了在 URL 上放置.js,即使声明了format: 'js'respond_to { format.js } .js.erb 查看文件
  • 我知道format 很有意义,但api.jquery.com/jquery.ajax 这不是一个选项:)
  • 在我看来,我们的答案相得益彰
  • 在 URL 上传递 .js 使 dataType 无关
猜你喜欢
  • 2015-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 2012-07-09
  • 2019-11-04
  • 2016-01-02
相关资源
最近更新 更多