2016-09-19 2 views
0

Ich habe vier Schleifen in meinem haml Dokument zu Testzwecken mit dem einzigen Unterschied, dass die Reihenfolge der Elemente ist.

Bin ich irgendwie in der Lage, die Logik in meinem Controller zu setzen und die ganze 'Unordnung' der Schleife nur einmal in meinem haml Dokument aufzulisten?
Momentan habe ich alles 4 mal dupliziert und weißt du, das fühlt sich schlecht an. :)Schienen 4: Wie man eine Schleifenlogik in den Controller einfügt

Zum Beispiel:

- @loop.where(featured: true).order("RANDOM()").limit(4).each do |item| 
    %li 
     %h1 This is an example 
- @loop.order(:cached_votes_up => :desc).limit(4).each do |item| 
    %li 
     %h1 This is an example 
- @loop.order(:impressions_count => :desc).limit(4).each do |item| 
    %li 
     %h1 This is an example 
- @loop.order("created_at DESC").limit(4).each do |item| 
    %li 
     %h1 This is an example 

Controller:

def index 
    @loop = Item.all 
end 

Ich mag meinen Haml-Code zu so etwas wie diese reduzieren und den Rest im Controller bewegen:

- @loop.each do |item| 
    %li 
     %h1 This is an example 

Vielen Dank im Voraus für jede Antwort!

+0

Was ist '@ loop'? Was versuchst du genau? Ohne das Problem zu verstehen, können wir dir nicht helfen. – Surya

+0

Entschuldigung, ich habe das zur Antwort hinzugefügt :) – Gugubaight

+0

Zeigen Sie, was Sie erwarten. –

Antwort

2

Sie können die Ansicht nicht mehrfach rendern, aber Sie könnten so etwas tun.

def index 
    @loops = [ 
    Item.where(featured: true).order("RANDOM()"), 
    Item.order(:cached_votes_up => :desc), 
    Item.order(:impressions_count => :desc), 
    Item.order("created_at DESC") 
    ] 
end 

Und dann in der Vorlage

- @loops.each do |loop| 
- loop.limit(4).each do |item| 
    %li 
    %h1 This is an example 
+0

Nur eine Frage dazu: Wird das alles viermal mit verschiedenen Ordnungen (wie vorgesehen) rendern, oder wird das alles einfach zu einer Schleife kombinieren? – Gugubaight

+0

Es ist zwei Schleifen. Die erste Schleife ruft die zweite Schleife 4 Mal auf (jedes Mal mit den Elementen in einer anderen Reihenfolge). Die zweite Schleife rendert den HTML-Code für jedes Element in dieser Schleife. –

+0

Und wo initiierst du die 'loop'-Schleife? – Gugubaight

2

in Item Modellklasse:

scope :featured_with_random_order_desc, ->(limit_value) { where(featured: true).order("RANDOM()").limit(limit_value) } 

scope :by_cached_votes_order_desc, ->(limit_value) { order(:cached_votes_up => :desc).limit(limit_value) } 

scope :by_impression_count_order_desc, ->(limit_value) { order(:impressions_count => :desc).limit(limit_value) } 

scope :by_created_at_desc, ->(limit_value) { order("created_at DESC").limit(limit_value) } 

In Ihren Ansichten:

- @loop.featured_with_random_order_desc(4).each do |item| 
    %li 
     %h1 This is an example 
- @loop.by_cached_votes_order_desc(4).each do |item| 
    %li 
     %h1 This is an example 
- @loop.by_impression_count_order_desclimit(4).each do |item| 
    %li 
     %h1 This is an example 
- @loop.by_created_at_desc.limit(4).each do |item| 
    %li 
     %h1 This is an example 

Sie noch einen Schritt weiter gehen und erstellen Variable für jede Schleife in Ihrem Controller:

def index 
    @loop_featured = Item.featured_with_random_order_desc(4) 
    @loop_cached_votes = Item.by_cached_votes_order_desc(4) 
    @loop_impression_counts = Item.by_impression_count_order_desclimit(4) 
    @loop_by_created = Item.by_created_at_desc(4) 
end 

und verwenden Sie sie in Sicht:

- @loop_featured.each do |item| 
    %li 
    %h1 This is an example 
- @loop_cached_votes.each do |item| 
    %li 
    %h1 This is an example 
- @loop_impression_counts.each do |item| 
    %li 
    %h1 This is an example 
- @loop_by_created.each do |item| 
    %li 
    %h1 This is an example 
0

können Sie union_scope verwenden von ActiveRecord

#item.rb 

    include ActiveRecord::UnionScope 
    scope :by_random, -> { where(featured: true).order("RANDOM()").limit(4) } 
    scope :by_cached_votes, ->{ order(:cached_votes_up => :desc).limit(4) } 
    scope :by_impression_count, ->{ order(:impressions_count => :desc).limit(4) } 
    scope :by_created_at, ->{ order("created_at DESC").limit(4) } 

    scope: all_conditions, -> { union_scope(by_random, by_cached_votes,by_impression_count,by_created_at} 

Ihr Controller

@item = Item.all_conditions 

Ihre Ansicht:

- @loop.all_conditions.each do |item| 
Verwandte Themen