2011-01-04 13 views
0

Die folgende Ansicht Code eine Reihe von Links mit Summen erzeugt (wie erwartet):Rails 3 Refactoring Ausgabe

<% @jobs.group_by(&:employer_name).sort.each do |employer, jobs| %> 
    <%= link_to employer, jobs_path() %> <%= "(#{jobs.length})" %> 
<% end %> 

Allerdings, wenn ich die Ansicht des Code und bewegen Sie die Logik zu einem Helfer Refactoring, doesn der Code‘ t arbeiten wie erwartet.

Ansicht:

<%= employer_filter(@jobs_clone) %> 

Helfer:

def employer_filter(jobs) 
    jobs.group_by(&:employer_name).sort.each do |employer,jobs| 
     link_to employer, jobs_path() 
    end 
end 

Die folgende Ausgabe erzeugt:

<Job:0x10342e628>#<Job:0x10342e588>#<Job:0x10342e2e0>Employer A#<Job:0x10342e1c8>Employer B#<Job:0x10342e0d8>Employer C#<Job:0x10342ded0>Employer D# 

Was bin ich nicht zu verstehen? Auf den ersten Blick scheint der Code gleichwertig zu sein.

Antwort

0

Diese Syntax gearbeitet, wie ich es gehofft:

def employer_filter(jobs_clone) 
    jobs_clone.group_by(&:employer_name).sort.collect { |group,items| 
     link_to(group, jobs_path()) + " (#{items.length})" 
    }.join(' | ').html_safe 
end 
1

Im ersten Beispiel wird direkt an erb ausgegeben, im zweiten Beispiel wird das Ergebnis dieser Methode zurückgegeben.

Try this:

def employer_filter(jobs) 
    employer_filter = "" 
    jobs.group_by(&:employer_name).sort.each do |employer,jobs| 
     employer_filter += link_to(employer, jobs_path()) 
    end 
    employer_filter 
end 

Dann ist es wie dies in der Ansicht nennen:

raw(employer_filter(jobs)) 

Auch die Verwendung von "raw" beachten. Sobald Sie die Generierung einer Zeichenfolge aus der Vorlage verschoben haben, müssen Sie den Rails mitteilen, dass sie nicht html-maskiert werden sollen.

Für zusätzliche Kredit, könnten Sie den "inject" -Befehl verwenden, anstatt die Zeichenfolge explizit zu erstellen, aber ich bin faul und wollte Ihnen geben, was ich weiß, würde ohne Test funktionieren.

+0

Schließen. Es gibt Werte wie Employer A anstelle des tatsächlichen Links zurück. Ich wäre gespannt auf die .inject-Syntax. Unterstützt ein OrderedHash (von dem das eine ist) die .collect-Methode? – craig

+0

was bedeutet "tatsächlicher Link"? –

+0

Anstelle des Links wird das Anker-Tag wie oben beschrieben angezeigt - als Text. Ich denke, das heißt "entkommen". – craig