【问题标题】:Show records only belonging to that user ruby on rails显示仅属于该用户的记录 ruby​​ on rails
【发布时间】:2019-10-22 21:30:12
【问题描述】:

我有以下代码

<div class="container mt-4">
  <div class="card">
    <div class="card-header">
      <h5>Name: <%= @user['name'] %> | Username: <%= @user['username'] %></h5>
    </div>

    <div class="card-body">
      <h5 class="card-title">User details</h5>

      <ul class="card-text">
        <li>ID: <%= @user['id'] %></li>
        <li>Name: <%= @user['name'] %></li>
        <li>E-mail: <%= @user['email'] %></li>
      </ul>

      <ul>
        <h5>Address</h5>
        <li>Street: <%= @user['address']['street'] %></li>
        <li>Suite: <%= @user['address']['suite'] %></li>
        <li>City: <%= @user['address']['city'] %></li>
        <li>Zipcode: <%= @user['address']['zipcode'] %></li>
        <li>Geo Lat: <%= @user['address']['geo']['lat'] %></li>
        <li>Geo Lng: <%= @user['address']['geo']['lng'] %></li>
      </ul>

      <ul>
        <li>Phone Number: <%= @user['phone'] %></li>
        <li>Website: <%= @user['website'] %></li>
      </ul>

      <ul>
        <h5>Company details</h5>
        <li>Company name: <%= @user['company']['name'] %></li>
        <li>Company catchphrase: <%= @user['company']['catchPhrase'] %></li>
        <li>Company bs: <%= @user['company']['bs'] %></li>
      </ul>

      <h5 class="card-title">User Albums</h5>

      <div class="row">
        <% @albums.each do |album| %>
          <div class="col-md-4 mb-4">
            <h5 class="card-title">
              <%= album['title'] %>
            </h5>

            <%= link_to "View Album", album_path(album['id']), class: "btn btn-primary" %>
          </div>
        <% end %>
      </div>

      <%= will_paginate @albums, renderer: WillPaginate::ActionView::BootstrapLinkRenderer, class: 'margin-auto' %>
    </div>
  </div>
</div>

users_controller.rb

class UsersController < ApplicationController
  def show
    @user = HTTParty.get('https://jsonplaceholder.typicode.com/users/' + params[:id], :headers => {'Content-Type' => 'application/json'})

    @albums = HTTParty
      .get('https://jsonplaceholder.typicode.com/albums', :headers => {'Content-Type' => 'application/json'})
      .paginate(:page => params[:page], :per_page => 6)
  end
end

我的所有数据都来自外部 API。

在我浏览each 相册的地方,我只需要显示属于该用户的相册,因为目前,我正在循环浏览所有相册,无论它们是否属于该用户。

相册有一个 userId。

【问题讨论】:

  • @albums = Album.where(user: User.current)User.current 或您为找到当前登录的用户所做的任何事情)而不是 @albums = Album.all
  • @Viktor - 不幸的是,OP 没有说明他们正在处理从外部 API 接收的数组,而不是 ActiveRecord 对象。
  • 我错过了控制器代码,添加了@Viktor
  • @jvillian ^^ 请见上文

标签: ruby-on-rails json ruby api


【解决方案1】:

使用.select,嗯,嗯,选择只有专辑的'userId'@user['id']匹配的那些专辑:

class UsersController < ApplicationController
  def show
    @user = HTTParty.get('https://jsonplaceholder.typicode.com/users/' + params[:id], :headers => {'Content-Type' => 'application/json'})

    @albums = HTTParty
      .get(
        'https://jsonplaceholder.typicode.com/albums', 
        :headers => {'Content-Type' => 'application/json'}
      )
      .select{|a| a['userId'] == @user['id']}
      .paginate(:page => params[:page], :per_page => 6)
  end
end

【讨论】:

  • 哦,好吧,这很简单,然后就过度思考了。然而,分页似乎确实中断了,undefined method total_pages' for []:Array`
  • 尝试将.select向上移动一行。
  • 你在用什么. paginate gem——典型的是kaminariwill_paginate。一般来说,您尝试做的事情不会扩展,因为分页实际上是一个活动关系对象,因此分页作为查询限制传递给底层活动记录 SQL 调用
【解决方案2】:

在您的控制器负责显示该页面的操作上,您应该执行类似的操作

@albums = Album.where(user_id: @user.id)

这样当您在视图上调用@albums 时,它只会包含控制器中预加载的文档。

或者,如果您使用 CanCan 之类的东西来管理权限,您应该可以这样做:

can :read, Album, user_id: user.id

因此,您将授予用户 读取 权限,以仅查看属于他的相册。

【讨论】:

  • 我已将控制器代码添加到问题中,但我会尝试您的解决方案。
【解决方案3】:

其他人的 API 应该为您进行分页。它几乎肯定不会按照您尝试的方式进行扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多