Rails:如何显示所有挂起的好友请求?

时间:2016-09-26 13:00:24

标签: ruby-on-rails

我正在处理我的第一个Rails项目,我遇到了一个小问题。我真的很感激任何帮助。 我想使用每个迭代器显示当前用户的所有待处理的好友请求。我的控制器:

class FriendRequestsController < ApplicationController
before_action :set_friend_request, except: [:index, :new, :create]

def index
  @incoming = FriendRequest.where(friend: current_user)
  @outgoing = current_user.friend_requests
end

def new
  @friend_request = FriendRequest.new
end

def create
  friend = User.find(params[:friend_id])
  @friend_request = current_user.friend_requests.new(friend: friend)
  if @friend_request.save
    redirect_back(fallback_location: root_path), status: :created, location: @friend_request
  else
    render json: @friend_request.errors, status: :unprocessable_entity
  end
end

当我尝试类似下面的代码时,它有点起作用,条件语句可以正常工作,但我知道这是一种让它工作的可怕方法,所以我想使用@incoming因为它的定义。

<% if FriendRequest.where(friend: current_user).present? %>
   <% ?.each do |request| %>
       <li><%= ? %></li>
   <% end %>
<% else %>
    You don't have any friend requests
<% end %>

但是当我尝试这样的事情时:

<% if @incoming.present? %>

即使当前用户有待处理的朋友请求,条件语句也无法正常工作,并且“您没有任何朋友请求”。 我还没有确切知道RoR中的一切是如何工作的,所以我要感谢你的解释。

2 个答案:

答案 0 :(得分:1)

<% if (frs = FriendRequest.where(friend: current_user)).present? %>
   <% frs.each do |fr| %>
       <li><%= fr.name %></li>
   <% end %>
<% else %>
    You don't have any friend requests
<% end %>

答案 1 :(得分:0)

让我们首先为传入的朋友请求创建一个特定的关联。

class User < ActiveRecord::Base
  # ...
  has_many :incoming_friend_requests,
    class_name: 'FriendRequest',
    source: :friend
end

由于Rails无法从关联名称派生正确的列,因此我们指定class_namesource告诉Rails FriendRequest上的关联是反向的。

当您开始考虑急切的加载和性能时,这非常重要。

例如,它可以让您:

@user = User.joins(:friend_requests, :incoming_friend_requests)
            .find(params[:id])

所以让我们使用新的关系:

def index
  @incoming = current_user.incoming_friend_requests
  @outgoing = current_user.friend_requests
end

要测试范围或集合中是否有任何项目使用.any?.any?非常聪明,因为如果已经加载关联,它将不会发出查询。

<% if @incoming.any? %>
  <ul>
  <% @incoming.each do |fr| %>
    <li><%= fr.name %></li>
  <% end %>
  </ul>
<% else %>
  <p>You don't have any friend requests</p>
<% end %>