29

Ich versuche mein Bestes, um einen Helfer zu bauen, der eine < 'ul> bestehend aus allen Mitgliedern einer Sammlung ausgibt. Für jedes Mitglied der Sammlung möchte ich eine < 'li> ausdrucken, die einen Titel und ein div von Links zu CRUD das Mitglied hat. Dies ist ziemlich ähnlich dem, was Rails für das Scaffolding für die Indexansicht ausgibt. HierVerwenden von Helfern in Schienen 3 zur Ausgabe von HTML

ist der Helfer die ich habe:

def display_all(collection_sym) 
    collection = collection_sym.to_s.capitalize.singularize.constantize.all 

    name = collection_sym.to_s.downcase 

    html = '' 

    html << "<ul class=\"#{name}-list\">" 

    for member in collection do 
    html << content_tag(:li, :id => member.title.gsub(' ', '-').downcase.strip) do 
    concat content_tag(:h1, member.title, :class => "#{name}-title") 
    concat link_to 'Edit', "/#{name}/#{member.id}/edit" 
    concat "\|" 
    concat link_to 'View', "/#{name}/#{member.id}" 
    concat "\|" 
    concat button_to 'Delete', "/#{name}/#{member.id}", :confirm => 'Are you sure? This cannot be undone.', :method => :delete 
    end 
    end 

    html << '</ul>' 

return html 
end 

Und das Ausgangs genau das, was ich will. Wenn jemand denkt, dass es einen besseren Weg gibt, das zu tun, dann bitte ich Sie, mich zu korrigieren, ich vermute, dass ich das auf eine Bass-awards-Weise mache, aber im Moment ist es die einzige Art, wie ich weiß, wie.

ich dann versucht, die Links in einem div zu wickeln, wie folgt:

def display_all(collection_sym) 
    collection = collection_sym.to_s.capitalize.singularize.constantize.all 

    name = collection_sym.to_s.downcase 

    html = '' 

    html << "<ul class=\"#{name}-list\">" 

    for member in collection do 
    html << content_tag(:li, :id => member.title.gsub(' ', '-').downcase.strip) do 
    concat content_tag(:h1, member.title, :class => "#{name}-title") 
    concat content_tag(:div, :class => "links-bar") do 
     concat link_to 'Edit', "/#{name}/#{member.id}/edit" 
     concat "\|" 
     concat link_to 'View', "/#{name}/#{member.id}" 
     concat "\|" 
     concat button_to 'Delete', "/#{name}/#{member.id}", :confirm => 'Are you sure? This cannot be undone.', :method => :delete 
    end 
    end 
end 

html << '</ul>' 

return html 
end 

, ich nicht mehr der Auszeichnungs innerhalb der zu der Ansicht div.links-Bar-Ausgang erhalten jetzt jedoch. Ich bin mir sicher, dass das etwas mit Block und Bindungen zu tun haben muss, aber ich kann für das Leben von mir herausfinden, was oder wie man es reparieren kann. Kann jemand Hilfe anbieten?

+3

Was ist es deine erste Absicht, Helfer einzusetzen? Warum nicht in der Vorlage? –

+0

Hmmmm, ich denke, ich könnte eine Vorlage verwenden, ich bin mir nicht sicher, warum ich nicht daran gedacht habe. – TheDelChop

+1

Partials ist der Weg, auf dem ich würde denken ... Kudos für den ganzen Code durchpflügen ... bekam Kopfschmerzen nur lesen ;-) – Ryan

Antwort

44

ich mit der Bemerkung überein, die Verwendung eines teilweise über empfehlen ... aber wenn Sie diese in einem Helfer Brauchen zu tun, das ist ein sauberer Weg zu implementieren:

def display_all(collection) 
    content_tag(:ul, class: "list") do 
    collection.collect do |member| 
     concat(content_tag(:li, id: member.name.gsub(' ', '-').downcase.strip) do 
     member.name 
     end) 
    end 
    end 
end 

Ich würde passieren in einer Sammlung explizit, anstatt ein Symbol zu übergeben, um eine Sammlung zu erstellen, so dass Sie nicht immer ALLE Datensätze in einer bestimmten Tabelle gleichzeitig anzeigen müssen. Sie könnten Paginierung hinzufügen usw.

+0

Ja, ich stimme zu, wenn ich es so mache, ist dies der beste Weg, es zu tun.Aber wie die anderen Jungs sagten, werde ich stattdessen einen Partial verwenden. Danke! – TheDelChop

+4

brauchst du keine concat für das innere content_tag? –

24

@ Joe kann Sie noch Ihre Methode display_all(collection_sym) Verwenden Sie einfach verwenden: return html.html_safe statt: return html

ich, dass nach wie vor in vielen Situationen finden, ist es besser, HTML von Helfern zu generieren, anstatt Teile zu verwenden. So die html_safe Funktion in Rails 3 wird sicherstellen, dass Sie HTML generieren, anstatt es in String konvertieren.

+0

Arbeitete wie ein Charme für mich, und ist nett und einfach, wenn ich nur muss Generiere ein oder zwei Tags vom Helfer. –

2

Wie @TheDelChop sagt, müssen Sie ein concat für die innere content_tag, ansonsten ist der Ausgang nur <ul></ul>

Hier ist, wie das aussieht:

def display_all(collection) 
    content_tag(:ul, :class => "list") do 
    collection.collect do |member| 
     concat(
     content_tag(:li, :id => member.name.gsub(' ', '-').downcase.strip) do 
      member.name 
     end 
    ) 
    end 
    end 
end 

Weitere Erklärung hier: Nesting content_tag in Rails 3