【问题标题】:Show partial in the same page using ajax request使用ajax请求在同一页面中显示部分
【发布时间】:2017-10-12 00:03:29
【问题描述】:

我是 Rails 新手,我正在尝试为学校做一个简单的项目。

我已经生成了一个脚手架,如下所示。

rails generate scaffold Book title:string content:text code:string

我想要做的是,当我点击一个链接时,在同一页面 (localhost:3000/books) 的一个 div 中显示书籍 ID 的列表。我尝试遵循this 程序,但它似乎不起作用,当我单击 /books 页面末尾的链接时,页面上没有明显呈现任何内容

这是我的书/index.html.erb

<p id="notice"><%= notice %></p>

<h1>Books</h1>

<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Content</th>
      <th>Code</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @books.each do |book| %>
      <tr>
        <td><%= book.title %></td>
        <td><%= book.content %></td>
        <td><%= book.code %></td>
        <td><%= link_to 'Show', book %></td>
        <td><%= link_to 'Edit', edit_book_path(book) %></td>
        <td><%= link_to 'Destroy', book, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Book', new_book_path %>

<br>

<%= link_to 'All books', books_path, remote: true %>
<br>
<br>
<div id="content" >
</div>

我的 books_controller 的索引方法

def index
    @books = Book.all

    respond_to do |format|
      format.html
      format.js
    end
  end

_books 部分

<% @books.each do |book| %>
    <div class="book">
      <%= book.id %>
    </div>
<% end %>

还有书籍/index.js.erb

$("#content").html("<%= j (render 'books') %>");

当我点击应该呈现部分的链接时,我在终端中得到了这个,页面上没有显示任何内容。

Started GET "/books" for 127.0.0.1 at 2017-05-12 17:35:02 +0200
Processing by BooksController#index as JS
  Rendering books/index.js.erb
  Book Load (0.3ms)  SELECT "books".* FROM "books"
  Rendered books/_books.html.erb (2.4ms) [cache miss]
  Rendered books/index.js.erb (3.9ms)
Completed 200 OK in 8ms (Views: 6.0ms | ActiveRecord: 0.3ms)

我想我错过了什么,但我真的不知道为什么。有任何想法吗?谢谢

PS:Rails 版本:5.1.0 和 ruby​​ 2.4.0

【问题讨论】:

  • 打开浏览器控制台并单击链接。您应该会看到一个请求被触发。该请求的响应是什么?
  • 我没有看到带有 id=content 的 div/container,所以,我猜事情没有被替换,因为没有具有该 ID 的容器。
  • @fanta 它在最底层
  • @SebastiánPalma 在这里你可以找到我的代码github.com/engid87/books

标签: javascript jquery ruby-on-rails ruby ajax


【解决方案1】:

Rails 5.1 不依赖于 jQuery。这段代码:

$('#content').html("<%= j (render 'books') %>");

是 jQuery 代码。如果您添加 jquery-rails gem 并按照文档操作,您的代码应该可以工作。

【讨论】:

    【解决方案2】:

    我不确定您的代码的问题出在哪里,但我可以建议对我来说更优雅的替代方案。我建议将 jquery onClick 处理程序绑定到您的链接,并让它向服务器执行 ajax 请求 - 到不同的视图或重新编码相同的视图 - 发送回一个包含所有数据的 json 对象,ajax 成功处理程序可以然后操作页面内的html。像这样的:

    $("#all_books_link").click(function() {
      $.ajax({
         dataType: "json",
         url: <PUT ALL BOOKS SERVER URL HERE>,
         success:function(data) {
            for (var key in data) {
               $("#content").append("<div>"+data[key]+"</div>"
            }
         }
       });
    });
    

    您的服务器端 rails 函数应该返回一个 json 对象,而不是实际的 HTML。

    【讨论】:

    • 这就是 OP 的代码正在做的事情。它只是在 Rails 域中进行。
    • @InEptSoftware,他的解决方案通过 rails 部分返回 HTML 并执行通过单独文件加载的 javascript。这对我来说似乎很脏。我宁愿让服务器只发送一个 json 对象,让 jquery 和其他 javascript 从初始页面加载开始就存在于客户端中。我猜对每个人来说都是他自己的。
    • 我理解你的思考过程,但 OP 说他是 Rails 新手。我认为此时他使用 Rails 约定优于配置要容易得多。不过我确实喜欢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多