2016-09-26 6 views
0

私は最初の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でのすべての動作を正確に把握していないので、説明に感謝します。

+1

hm、 '@ incoming.present?' _should_ work。おそらくタイプミスをしましたか?また、 '@ incoming.exists?'を試してみてください(若干異なるチェックです) –

+0

あなたが書いたhtmlコードはapp/views/friend_requests/index.html.erbの中にあるのですか? –

+0

@ShabiniRajadasありがとうございます。それは問題でした、私はnavbarのドロップダウン(私は私の記事で言及すべきである)でそれをやろうとしました、あなたの提案の後に私はapp/views/friend_requests/index.html.erbでmaxのコードを使用し、 。それは私のnavbarで動作させるための方法はありますか? –

答えて

0

受信友人要求の特定の関連付けを作成することから始めましょう。

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

Railsは、我々はclass_nameを指定アソシエーションの名前から適切な列を導き出すことができないので。 sourceは、FriendRequestの関連が逆であることをRailsに伝えます。

これは、熱心な負荷とパフォーマンスを見始めたときに非常に重要です。

たとえば、それはあなたが行うことができます:スコープまたはコレクション使用.any?のいずれかの項目があるかどうかをテストするには

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

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

だから新しい関係を使用することができます。 .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 %> 
+0

'present?'は、パラメータキー、インスタンス変数などの存在を確認するときに便利です。 – max

+0

このような長い答えをありがとうございました。私は完全に遅れて、ナビゲーションバーのドロップダウンメニューでコードを使用しようとしました。私の質問で言及したが、私はそれが関係しているのか分からなかった。私のモデルで何も変更しなくても、あなたのコードはapp/views/friend_requests/index.html.erbに入れると完全に動作します。 –

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 %> 
+3

DB問合せをビューに入れるのは悪いことです。正しいデータを取得することはビューの関心事ではありません。 –

+0

彼らが述べているように質問に答えることは私の懸念です。 Dave Thomasは、ビューのロジックについて頻繁にコメントしていますが、手に入ることはできませんが、IMHOは、あなたのコントローラ(ヘルパー)に、あまり意味のないビューが設定されているよりも、しかし、私は脱走する。しかし、下の投票を歓迎する.. –

+0

ポイントは、インスタンスvar _should have_働いた。私たちがここで見ることができるよりもうまくいかないことがあります。あなたのソリューションは、問題を隠しているだけで解決できません。 –

関連する問題