2016-09-26 5 views
0

Ich arbeite an meinem ersten Rails-Projekt und habe ein kleines Problem. Ich würde jede Hilfe sehr schätzen. Ich möchte alle ausstehenden Freundschaftsanfragen für einen aktuellen Benutzer mit jedem Iterator anzeigen. Mein Controller:Schienen: Wie werden alle ausstehenden Freundschaftsanfragen angezeigt?

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 

Wenn ich so etwas wie ein Code unten versuchen, funktioniert es irgendwie, die bedingte Anweisung funktioniert, wie es sollte, aber ich weiß, es ist eine schreckliche Art und Weise, damit es funktioniert, so möchte ich nutzen @incoming seit es definiert ist.

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

Aber wenn ich versuche, so etwas wie:

<% if @incoming.present? %> 

Die bedingte Anweisung funktioniert nicht richtig, und es gibt ‚Sie haben keine Freundschaftsanfragen‘, auch wenn der aktuelle Benutzer ein ausstehendes hat Frage von einem Freund. Ich verstehe noch nicht genau, wie alles in RoR funktioniert, also wäre ich dankbar für eine Erklärung.

+1

Hm, '@ incoming.present?' _should_ work. Hast du vielleicht einen Tippfehler gemacht? Versuchen Sie auch '@ incoming.exists?' (Es ist eine etwas andere Überprüfung) –

+0

Sind Sie sicher, dass der HTML-Code, den Sie geschrieben haben, in app/views/friend_requests/index.html.erb liegt? –

+0

@ShabiniRajadas danke. Das war das Problem, ich hatte versucht, es in einem Navbar Dropdown zu tun (was ich in meinem Post hätte erwähnen sollen), nach Ihrem Vorschlag habe ich den Code von max in app/views/friend_requests/index.html.erb verwendet und es funktioniert einwandfrei . Gibt es einen Weg, um es in meiner Navbar arbeiten zu lassen? –

Antwort

0

Beginnen wir mit dem Erstellen einer bestimmten Zuordnung für eingehende Freundschaftsanfragen.

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

Da Rails nicht die richtigen Spalten aus dem Namen der wir die class_name angeben Vereinigung herleiten. source teilt Rails mit, welche Verknüpfung bei FriendRequest die Umkehrung ist.

Dies ist äußerst wichtig, wenn Sie anfangen, eifrig laden und Leistung zu betrachten.

Zum Beispiel können Sie damit tun:

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

lässt also die neue Beziehung verwenden:

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

Um zu testen, ob es irgendwelche Elemente in einem Rahmen oder Sammlung .any? Gebrauch sind. .any? ist ziemlich schlau, da es keine Abfrage ausgibt, wenn die Verknüpfung bereits geladen ist.

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

'vorhanden?' Ist nützlicher beim Überprüfen auf das Vorhandensein von Parameterschlüssel, Instanzvariable etc. – max

+0

Vielen Dank für so eine lange Antwort, ich ging voll zurück und versuchte, den Code in einem Navbar Dropdown zu verwenden, was ich sollte habe in meiner Frage erwähnt, aber ich hatte keine Ahnung, dass es relevant ist. Ihr Code funktioniert perfekt, wenn ich ihn in app/views/friend_requests/index.html.erb einfüge, auch ohne etwas an meinen Modellen zu ändern. –

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-Abfragen in einer Ansicht zu platzieren ist eine schlechte Übung. Das Einholen korrekter Daten ist nicht das Anliegen von View. –

+0

Die Beantwortung von Fragen, wie sie angegeben sind, ist meine Sorge. Dave Thomas hat sich häufig über Logik in Ansichten geäußert, und obwohl er außer Kontrolle geraten kann, schlägt er einen pragmatischen Ansatz vor, der IMHO besser ist, als zigfache Instanzvariablen in Ihrem Controller (oder Helfern) für nicht triviale Ansichten eingerichtet zu haben ... aber ich schweife ab .. Schätzen Sie die down vote jedoch .. –

+0

Der Punkt ist, die Instanz var _should have_ hat funktioniert. Da läuft noch etwas anderes schief, als wir hier sehen können.Ihre Lösung maskiert nur das Problem und löst es nicht. –

Verwandte Themen