我正在处理我的第一个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中的一切是如何工作的,所以我要感谢你的解释。
答案 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_name
。 source
告诉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 %>