2016-09-18 28 views
0

如果當前用戶請求了用戶,或者當前用戶已被他們請求,我試圖讓用戶索引中的用戶旁邊出現Pedning Request字樣。我有一種感覺,我的呃,或者我只是完全錯誤的做法。當我點擊添加朋友鏈接時,我希望它重新引導到索引頁面,並且具有更新的請求狀態,但它仍然顯示添加朋友鏈接。Rails:在視圖中顯示待處理的朋友請求

index.html.erb 

Facebook Users: 
<ul><% @users.each do |user| %> 

    <% if current_user == user || current_user.friends.include?(user) %> 
     <li><%= link_to user.email, user_path(user) %></li> 
<% current_user.friend_requests.each do |request| %> 
    <% if request.friend_id == user.id %> 
    <li><%= link_to user.email, user_path(user) %> 
     | Pending Request</li> 
     <% end %> 
     <% end %> 
    <% else %> 
     <li><%= link_to user.email, user_path(user) %> | 
     <%= link_to "Add Friend", friend_requests_path(friend_id: user.id), method: :post %> 
     </li> 
    <% end %> 
<% end %> 
</ul> 

<%= link_to 'Back to your profile', user_path(current_user) %> 


<%= render 'shared/error_messages', object: current_user %> 

<%= params.inspect %> 

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

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

def create 
    @user = User.find(current_user) 
    @friend = User.find(params[:friend_id]) 
    @friend_request = current_user.friend_requests.new(friend_id: @friend.id) 

    if @friend_request.save 
     flash[:notice] = "Friend request sent!" 
     redirect_to users_path 
    else 
     flash[:notice] = "Unable to request friend" 
     redirect_to users_path 
    end 
end 

def update 
    friend_email = User.find(@friend_request.friend_id).email 

    @friend_request = FriendRequest.find_by_user_id_and_friend_id(params[:friend_id], params[:id]) 
    if @friend_request.accept 
     flash[:notice] = "You and #{friend_email} are now friends!" 
     redirect_to user_path(current_user) 
    end 

end 

def destroy 
    if @friend_request.destroy 
     flash[:notice] = "Request Declined" 
     redirect_to user_path(current_user) 
    end 
end 


private 

def set_friend_request 
    @friend_request = FriendRequest.find_by_user_id_and_friend_id(params[:friend_id], params[:id]) 
end 
end 
+0

你檢查過'friend_requests從'軌道控制檯'表爲了驗證記錄實際上創建正確? – dp7

+0

是的,我知道它正在發送,因爲請求會彈出在其他用戶的頁面上,並閃爍說請求發送彈出的重定向 –

回答

1

if塊開始...

<% if request.friend_id == user.id %> 

...是裏面的 '如果' 塊開始...

<% if current_user == user || current_user.friends.include?(user) %> 

所以基本上只有當用戶是喲時才能顯示「待處理的請求」自己(當前用戶)或者用戶已經是你的朋友。當然,這沒有意義。

不如第一if後移動代碼的else,你並不真的需要遍歷所有each的要求,只是映射friend_id

<ul> 
<% @users.each do |user| %> 
    <% if current_user == user || current_user.friends.include?(user) %> 
    <li><%= link_to user.email, user_path(user) %></li> 
    <% else %> 
    <% if current_user.friend_requests.pluck(:friend_id).include? user.id %> 
     <li><%= link_to user.email, user_path(user) %> 
      | Pending Request</li> 
    <% else %> 
     <li><%= link_to user.email, user_path(user) %> | 
     <%= link_to "Add Friend", friend_requests_path(friend_id: user.id), method: :post %> 
     </li> 
    <% end %> 
    <% end %> 
<% end %> 
</ul> 
+0

這工作。非常感謝!起初,我曾用.pluck(&:friend_id)試過它,但它沒有起作用,但我拿出了&,正如我在這裏看到的那樣。謝謝! –

+0

是的,我原本是用(&:friend_id)「映射」的,但是「pluck」效率更高,所以我改變了它,但忘了取出「&」後再編輯。你在編輯之間抓到我。 :) – SteveTurczyn