29

我在盡我所能構建一個幫助程序,輸出一個<'ul>,其中包含集合的所有成員。對於集合中的每個成員,我想打印出一個有標題的<'li>,以及一個鏈接到CRUD成員的鏈接。這與Rails爲索引視圖的腳手架輸出非常相似。在rails 3中使用助手來輸出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 

這輸出正是我想要的。首先,如果有人認爲有更好的方法來做到這一點,請隨時糾正我,我懷疑我是以低音的方式來做這件事,但目前它是我知道如何做的唯一方法。

然後我試圖包裹鏈接在一個div如下:

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 

不過,我現在不再得到任何標記的div.links反輸出到視圖中。我相信這肯定與塊和綁定有關,但我可以爲我的生活找出修復它的方法或方法。任何人都可以提供任何幫助嗎?

+3

什麼你的第一個意圖是使用助手嗎?爲什麼不用模板來做呢? – 2010-08-24 22:24:54

+0

嗯,我想我可以使用一個模板,我不知道爲什麼我沒有想到這一點。 – TheDelChop 2010-08-24 22:57:40

+1

partials是繼續這樣做的方式我會認爲...通過所有的代碼耕耘的榮譽...只是讀它頭痛;-) – Ryan 2010-08-25 21:40:36

回答

44

我同意上述推薦使用的部分的註釋......但如果你確實需要做到這一點的幫手,這是實現一個更清潔的方式:

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 

我會通過在一個集合中明確地而不是傳入一個符號來創建一個集合,所以你並不總是需要一次顯示一個特定表中的所有記錄。您可以添加分頁等

+0

是的,我同意如果我這樣做,這是最好的辦法。但是正如其他人說的,我會用一個部分來代替,謝謝! – TheDelChop 2010-09-05 17:28:11

+4

你不需要內部content_tag的concat嗎? – 2013-03-02 21:56:26

24

@Joe, 你仍然可以使用你的方法display_all(collection_sym) 只需使用:的 return html.html_safe 代替: return html

我還發現,在許多情況下,它是更好地從助手生成HTML,而不是使用部分。因此,Rails 3中的html_safe函數將確保您生成HTML,而不是將其轉換爲String

+0

對我來說就像一個魅力,而且當我只需要從助手中生成一個或兩個標籤。 – 2015-12-08 02:24:20

2

由於@TheDelChop說,你需要爲內部content_tag一個concat,否則輸出只是<ul></ul>

這裏是一個樣子:

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 

更多解釋在這裏:Nesting content_tag in Rails 3