AJAX请求页面未重新渲染后

Posted

技术标签:

【中文标题】AJAX请求页面未重新渲染后【英文标题】:After AJAX request page isnt re rendered 【发布时间】:2021-07-19 17:31:53 【问题描述】:

我在 blogs_controller 中的帖子可以通过天赋来选择。天赋可以通过下拉选择。当我选择任何其他选项时,页面正在使用 ajax 重新加载并且一切正常,但是如果我按下提交按钮,它应该发送空的 :flair 值并再次渲染页面和表格,但它会发送,我看看如何所有帖子都被选中,但没有任何变化,为什么? 这个我真的看不懂。

#blog_controller.rb
  def index

    @blogs = Blog.order("created_at desc")

    if !(params[:flair].blank?)
      @blogs = @blogs.where(:flair => params[:flair])
    end
    respond_to do |format|
      format.html
      format.json
    end
  end

  def blog_params
      params.require(:blog).permit(:name, :title, :content, :flair)
  end
#index.html.haml
%h1 Listing blogs

= form_with method: :get do |f|
  = f.select :flair, @flairs, ,onchange: "this.form.submit()"
  = f.submit 'Clear', params: flair: ""

= render 'table'
%br
#_table.html.haml
%table#table
  %thead
    %tr
      %th Name
      %th Title
      %th Content
      %th Flair

  %tbody
    - @blogs.each do |blog|
      %tr
        %td= blog.name
        %td= blog.title
        %td= blog.content
        %td= blog.flair
        %td= link_to 'Show', blog
        %td= link_to 'Edit', edit_blog_path(blog)
        %td= link_to 'Destroy', blog, method: :delete, data:  confirm: 'Are you sure?' 

【问题讨论】:

【参考方案1】:

这是因为您的请求需要一个 JS 响应,并且由于您不在控制器中处理它,因此它默认为 HTML。除非您在提交时重新加载页面,否则 HTML 不会重新呈现,因此即使调用了控制器方法,UI 中也不会发生任何事情。

【讨论】:

好的,我会添加index.js.haml,但是为什么选择器会起作用? 调试这些东西的最简单方法是在控制器方法中检查您发送的请求:raise request.headers.inspect。我的预感是,您实际上是在重新加载页面,而不是实际使用 Ajax,如果不进行调试很难判断。 你能多谈谈raise吗?如何使用它以及在哪里可以找到文档。 没有很多关于它的文档apidock.com/ruby/Kernel/raise,因为这是在代码中的任何位置强制运行 RunTimeError 的非常简单的方法。用于调试目的是很好的,如果你到达了你不应该访问的部分代码,甚至返回 500。

以上是关于AJAX请求页面未重新渲染后的主要内容,如果未能解决你的问题,请参考以下文章

ajax获取数据后怎么去渲染到页面

ajax获取的数据,怎么存储在页面

来自ajaxtowards flask的发布请求后页面未呈现

React 数据改变后页面没有重新渲染

一简单学习Ajax的GET & POST请求

ajax 请求后重新加载 dojo 小部件