在rails 3中使用helper输出html

The*_*hop 29 ruby html-helper ruby-on-rails actionviewhelper ruby-on-rails-3

我正在努力构建一个帮助器,输出一个由集合的所有成员组成的<'ul>.对于集合中的每个成员,我想打印出一个带有标题的<'li>,以及一个指向CRUD成员的div链接.这与Rails为索引视图的脚手架输出非常相似.

这是我得到的帮手:

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 
Run Code Online (Sandbox Code Playgroud)

而那输出正是我想要的.首先,如果有人认为有更好的方法可以做到这一点,请随意纠正我,我怀疑我是以低音方式做到这一点,但此刻它是我知道如何的唯一方式.

然后我尝试将链接包装在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 
Run Code Online (Sandbox Code Playgroud)

但是,我现在不再将div.links-bar输出中的任何标记添加到视图中.我确定这必须与块和绑定有关,但我可以为我的生活弄清楚修复它的方法或方法.任何人都可以提供任何帮助吗?

Dav*_*tte 46

我同意上面的评论建议使用部分...但如果您需要在帮助程序中执行此操作,这是一种更清晰的实现方式:

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
Run Code Online (Sandbox Code Playgroud)

我会明确地传入一个集合,而不是传递一个符号来创建一个集合,因此你并不总是需要一次显示特定表中的所有记录.你可以添加分页等.

  • 你不需要内部content_tag的concat? (4认同)

小智 24

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

我仍然发现在许多情况下,最好从帮助程序生成HTML,而不是使用部分.所以Rails 3中html_safe函数将确保您生成HTML,而不是将其转换为.String