在 Rails 3 中使用助手输出 html

Posted

技术标签:

【中文标题】在 Rails 3 中使用助手输出 html【英文标题】:Using helpers in rails 3 to output html 【发布时间】:2011-04-03 10:33:03 【问题描述】:

我正在尽我最大的努力构建一个输出由集合的所有成员组成的 的助手。对于集合的每个成员,我想打印出一个 ,它有一个标题,以及一个指向该成员的 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 

而那个输出正是我想要的。首先,如果有人认为有更好的方法可以做到这一点,请随时纠正我,我怀疑我是在用低音做这件事,但目前这是我知道的唯一方法。

然后我尝试将链接包装在一个 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-bar 输出中的任何标记发送到视图。我确信这一定与块和绑定有关,但我可以为我的一生弄清楚什么或如何去修复它。有人可以提供任何帮助吗?

【问题讨论】:

你使用助手的初衷是什么?为什么不在模板中这样做呢? 嗯,我想我可以使用模板,我不知道为什么我没有想到。 partials 是解决这个问题的方法,我认为...感谢您浏览所有代码...光是阅读就头疼 ;-) 基本问题不是块或绑定,而是您创建的字符串“html”被标记为非 HTML 安全。您可以使用 raw() 函数,尽管正如其他人所说,partials 或 content_tag 是更好的主意。只是想我会指出潜在的问题是什么,以供以后遇到类似但不同问题的人使用。 【参考方案1】:

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

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

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

【讨论】:

是的,我同意如果我要这样做,这是最好的方法。但正如其他人所说,我将使用部分代替。谢谢! 内部 content_tag 不需要 concat 吗?【参考方案2】:

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

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

【讨论】:

对我来说就像一个魅力,当我只需要从助手生成一个或两个标签时,它既好又简单。【参考方案3】:

正如@TheDelChop 所说,内部content_tag 需要一个concat,否则输出只是&lt;ul&gt;&lt;/ul&gt;

看起来是这样的:

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

【讨论】:

以上是关于在 Rails 3 中使用助手输出 html的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3. 如何添加 ActiveAdmin 将使用的助手?

Rails 路径助手在 js.coffee.erb 中不起作用

Rails:如何访问 RESTful 助手?

ruby 在Rails助手中创建一个HTML块。

如何将 Rails 视图助手提取到 gem 中?

如何在Rails中正确使用控制器助手模块,以及如何在这些助手之间建立连接?