0

我知道这个问题已经在 SO 上被问几次,但我很好奇以不同的方式做这件事。在我的 Ruby on Rails 应用程序中,我的UsersController.rb控制器上有一个名为list的操作。我希望这个列表能够回应 3 种不同的事情

  1. 页面本身。渲染我指定的用户的整个页面
  2. 我指定的页面的 JSON 用户列表
  3. 我指定格式为 HTML 的页面行的部分视图。

想象一个完整的页面(页眉、页脚、所有内容),其中包含一个包含第 1 页用户的表格。当我单击第 2 页时,我想启动一个 ajax 请求,返回到相同的控制器操作,只为我提供第 2 页的 html 行。我还想保留我的 JSON API,仍然允许我的控制器在被询问时返回 JSON 列表。我想它看起来像这样。

class UsersController < ApplicationController
    def list
        respond_to do |format|
            format.html # RETURNS MY VIEW
            format.json # RETURNS MY JSON LIST
            format.partial_html # RETURNS MY PARTIAL HTML
        end
    end
end

无论如何在RoR中实现这一点?还是我注定不得不在我的控制器中创建另一个动作,只是为了返回技术上相同的数据?

我可以通过指定我自己的 MIME 类型来实现这一点吗?我应该将部分蛇作为 XML 返回类型吗?

4

2 回答 2

3
  1. format.js在第三行使用。
  2. 将部分 html 放在部分上,调用它app/views/users/_html_rows.html.erb
  3. 在完整的 html 和 js 版本上呈现该部分。

您将拥有app/views/users/list.html.erb完整的 html 内容,如下所示:

<html>
<body>
.....
<table id="my_table"><%= render 'users/html_rows', users: @users %></table>
</body>
</html>

您将拥有app/views/users/_html_rows.html.erb

<tbody>
  <% users.each do |user| %>
    <tr>
      <td>user.name</td>
    </tr>
</tbody>

然后你将拥有app/views/users/list.js.erb

$("#my_table tbody").html("<%= render 'users/html_rows', users: @users %>");

这可能会解决你的问题。

于 2012-11-15T18:49:25.650 回答
0

您可以添加一个额外的 mime 类型条目以使用respond_to. 在config/initializers/mime_types.rb中,添加:

# htmlp means "html partial"
Mime::Type.register "text/html", :htmlp

在您的控制器中,您现在可以执行以下操作:

def list
  respond_to do |format|
    format.html
    format.json
    format.htmlp { render layout: nil }
  end
end

并创建一个模板list.htmlp.erb,其中包含您的部分内容。

于 2015-09-18T09:28:40.583 回答