29

Bir koleksiyonun tüm üyelerinden oluşan bir < 'ul> çıkaran bir yardımcı oluşturmak için elimden geleni yapıyorum. Koleksiyonun her üyesi için, bir unvanı olan bir < 'li> ve üyeye CRUD'a bir bağlantı dizisi yazdırmak istiyorum. Bu, Ray görünümünün dizin görünümü için iskele için çıktılarına oldukça benzer.Html çıkışında 3 yardımcıları kullanmak için html

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 

Ve istediğim tam olarak ne olduğunu çıkışı: Burada

bende yardımcısıdır. Her şeyden önce, eğer herkes bunu yapmak için daha iyi bir yol olduğunu düşünüyorsa, lütfen beni düzeltmek için çekinmeyin, bunu bir baston şekilde yaptığımı sanıyorum, ama şu andaki tek yolunu biliyorum.

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 

Ancak, ben artık görünümüne div.links çubuğu çıkış içindeki biçimlendirme herhangi olsun şu şekildedir:

Sonra bir div bağlantıları sarmak için çalıştı. Eminim bunun blok ve bağlarla ilgili bir şey olması gerektiğine eminim, ama hayatımı düzeltmek için ne yapacağımı ya da nasıl yapacağımı anlayabiliyorum. Herhangi bir yardım isteyen var mı?

+3

neler yardımcıları kullanarak ilk niyetiniz mi? Bunu neden şablonda yapmıyoruz? –

+0

Hmmmm, sanırım bir şablon kullanabilirim, neden böyle düşünmediğimi bilmiyorum. – TheDelChop

+1

partials bu yolda gitmenin yolu olduğunu düşünüyorum ... tüm bu kodla çiftleşmek için kudos ... sadece onu okurken bir baş ağrısı var ;-) – Ryan

cevap

44

Ben kısmi kullanımını öneren yukarıdaki yorum katılıyorum ... ama bir yardımcı içinde yapmanız gerekir MUYDUNUZ, bu uygulamaya daha temiz bir yoludur:

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 

Ben geçerdi Bir koleksiyonda bir koleksiyon oluşturmak için açıkça bir sembol oluşturmaktan ziyade, TÜM kayıtları her seferinde belirli bir tabloda görüntülemeniz gerekmez. return html.html_safe yerine: Hala birçok durumda bulmak

, bu

olduğunu return html Sen Hala display_all(collection_sym) Sadece kullandığınız yöntemi kullanabilirsiniz vb sayfa numaralarını

+0

Evet, eğer bunu böyle yapsaydım, bunu yapmanın en iyi yoluydu.Ama diğer adamların dediği gibi, yerine kısmi kullanacağım. Teşekkürler! – TheDelChop

+4

İç içerik_taşı için bir yardıma ihtiyacın yok mu? –

24

@Joe, ekleyebilirsiniz kısmi kullanmak yerine yardımcılardan HTML oluşturmak için daha iyi. Yani Rails 3html_safe işlevi, String dönüştürmek yerine HTML oluşturduğunuzdan emin olun. @TheDelChop söylediği gibi

+0

Benim için bir çekicilik gibi çalıştım ve sadece ihtiyacım olduğunda güzel ve basit yardımcıdan bir etiket veya iki tane oluşturun. –

2

, aksi çıktı İşte sadece <ul></ul>

olduğunu nasıl göründüğü ve iç content_tag için concat gerekiyor gibi:

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 
burada

fazla açıklama: Nesting content_tag in Rails 3