2016-04-20 10 views
0

Ich habe Probleme beim Erstellen verschachtelte if-Anweisungen. Ich habe eine Indexseite, in der ich Datensätze basierend auf einer Bedingung zeige. Mein Controller-Code für das heißt,Smepflying meine verschachtelte if-Anweisung in RubyOnRails

def index_orderSummary 
    if Date.today.month>=4 
    @order_summary = OrderSummary.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31")) 
    else 
    @order_summary = OrderSummary.where(:created_at=>("#{Time.now.year-1}-04-01")..("#{Time.now.year}-03-31")) 
    end 
    @order_summary = @order_summary.paginate(page: params[:page]).per_page(10).order("order_no ASC") 
end 

def index_issues 
    @user = User.new 
    @user = User.find(session[:user_id]).name 
    if Date.today.month>=4 
     @issue = Issue.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31")) 
    else 
     @issue = Issue.where(:created_at=>("#{Time.now.year-1}-04-01")..("#{Time.now.year}-03-31")) 
    end 
    @issue = @issue.paginate(page: params[:page], per_page: 10).order("issue_slip_no ASC") 
    end 

ich ein Suchfeld verwendet habe, für die ich die folgende Methode in der Steuerung geschrieben.

def search 
    if params[:id] == "search-order" then 
    @order_summary = OrderSummary.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31")).search(params[:search]) 
    @order_summary = @order_summary.paginate(page: params[:page]).per_page(5).order('order_no ASC') 
    render :action => :index_orderSummary 
    elsif params[:id] == "search-issue" then 
    @issue = Issue.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31")).search(params[:search]) 
    @issue = @issue.paginate(page: params[:page]).per_page(10).order("issue_slip_no ASC") 
    render :action => :index_issues 
    end 
end 

jetzt, was alles was ich brauche, möchte ich meine beiden Such- und Index Methoden integrieren.

Meine Indexmethoden haben bereits eine if else-Anweisung., Jetzt möchte ich überprüfen, ob Params aus der Suche kommt, dann möchte ich die gesuchten Ergebnisse im Index anzeigen. Wie erreiche ich das? Pls intime, wenn meine Frage ist nicht klar ..

Bitte bitte helfen und mich korrigieren. Vielen Dank im Voraus.

+0

also wollen Sie suchen, ob 'params [: id]' vorhanden ist und Ihren Index anzeigen, wenn es nicht ist? Welche der Indexmethoden möchten Sie integrieren oder wollen Sie, dass beide Indizes durchsucht werden können? Ich schätze, die beiden Indizes stimmen mit zwei verschiedenen Seiten in Ihrem Szenario überein. – ollaollu

+0

@ollaollu, Standardmäßig möchte ich die Indexseite anzeigen und dort gebe ich ein Suchfeld ein, nach dem die Suchergebnisse auf derselben Indexseite angezeigt werden sollen. Ich möchte index_orderSummary mit seiner jeweiligen Suchfunktionalität integrieren. – kelvin

Antwort

0

Ich denke, der Weg, dies zu gehen, ist eine wiederverwendbare Möglichkeit, die Bestellzusammenfassungen und die Probleme im Standardfall zurückgeben (ohne eine Suche), und dann Suchfilter auf die Basisergebnisse anwenden. Um dies zu tun, würde ich Methoden definieren, um die Standardfälle abzurufen, damit sie in den verschiedenen Abschnitten der if-else-Anweisungen wiederverwendet werden können. Wenn Sie viele verschachtelte if-Anweisungen haben, können Sie diese normalerweise bereinigen, indem Sie Methoden erstellen. Es würde sich in etwa so etwas wie dieses:

def index_orderSummary 
    if params[:id] = "search-order" 
    @order_summary = order_summary.search(params[:search]) 
     .paginate(page: params[:page]).per_page(5).order('order_no ASC') 
    else 
    @order_summary = order_summary 
     .paginate(page: params[:page]).per_page(10).order("order_no ASC") 
    end 
end 

def index_issues 
    @user = User.find(session[:user_id]).name 
    if params[:id] = "search-issue" 
    @issue= issue.search(params[:search]) 
     .paginate(page: params[:page]).per_page(10).order("issue_slip_no ASC") 
    else 
     @issue = issue.paginate(page: params[:page], per_page: 10).order("issue_slip_no ASC") 
    end 
end 

def order_summary 
    if Date.today.month>=4 
    return OrderSummary.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31")) 
    else 
    return OrderSummary.where(:created_at=>("#{Time.now.year-1}-04-01")..("#{Time.now.year}-03-31")) 
    end 
end 

def issue 
    if Date.today.month>=4 
    return Issue.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31")) 
    else 
    return Issue.where(:created_at=>("#{Time.now.year-1}-04-01")..("#{Time.now.year}-03-31")) 
    end 
end 
+0

Danke. Ich denke deine Antwort wird funktionieren. Aber kannst du mir das bitte deutlicher erklären? Ich bin nur ein Anfänger. Soll ich eine Ansicht für def order_summary und def issue erstellen? Warum Aussagen zurückgeben? Bitte erläutern Sie. – kelvin

+0

Sie benötigen keine Ansichten für def order_summary und def Problem. Dies sind nur typische Methoden, die von def index_orderSummary und def index_issues verwendet werden, um eine Liste von Auftragszusammenfassungen und -problemen aus Ihrer Datenbank abzurufen. Ich gebe sie in Methoden ein, damit Sie diese Daten abrufen können, indem Sie einfach die Methode aufrufen, anstatt dieselben Codezeilen mehr als einmal zu schreiben. Ziel ist es, DRY-Code zu schreiben (Wiederhole dich nicht). Ich habe return-Anweisungen verwendet, weil diese Methoden eine Sammlung von Zusammenfassungen oder Problemen von Bestellungen zurückgeben müssen. – hypern

+0

Siehe diese Zeile im Code zum Beispiel: order_summary.search (params [: search]). Hier rufe ich def order_summary auf und es wird die order_summaries durch Ausführen der where-Operation in der Methode zurückgeben. Es gibt dann die Ergebnisse zurück an die Index-Methode und gilt .search (params [: search]) – hypern

0

Sie in zwei Controller aufspalten

Es scheint, Sie versuchen, zwei verschiedene Ressourcen durch die gleiche Steuerung zurückzukehren, die nie eine gute Idee ist noch gute Übung. Ich würde die Controller-Aktionen zumindest aufteilen und zwei separate Routen erstellen. Es ist sauberer.

Sie könnten dann die gleiche Ansichtsvorlage verwenden, um die Ergebnisse anzuzeigen, wenn Sie deshalb ursprünglich alle in demselben Controller arbeiten. Aber ich würde empfehlen, auch die Vorlagen zu trennen und die gemeinsamen Teile in Teiltönen wiederzuverwenden.

Sie müssen es in dem gleichen Controller

sein, wenn Sie aus irgendeinem Grunde absolut haben die gleiche Controller-Aktion, zum Beispiel zu verwenden, wenn die Suchleiste ein Dropdown, die Sie wählen kann, welche Art der Ergebnisse zu zeigen, dann würde ich alle diese Logik in einem PORO bewegen mit der Logik zu tun, wie folgt aus:

class SearchResultsFactory 
    def self.search_for_type type, query, page 
    self.send(type.underscore, query, page) 
    end 

    def self.search_order query, page 
    # your code for finding order summaries 
    end 

    def self.search_issue query, page 
    # your code for finding issues 
    end 
end 

Und dann in Ihrem Controller würden Sie gerade tun müssen:

def index 
    @results = SearchResultsService.search_for_type(params[:id], params[:search], params[:page]) 
end 

Es ist sauberer und gibt Ihnen mehr Flexibilität, um mehr Arten von Elementen zum Suchen hinzuzufügen. Fügen Sie einfach eine Methode hinzu, die nach dem Typ benannt ist, den Sie suchen, und es wird von Anfang an unterstützt.

Verwandte Themen