Ruby on rails 如何使用块创建辅助对象?

Ruby on rails 如何使用块创建辅助对象?,ruby-on-rails,ruby,helper,Ruby On Rails,Ruby,Helper,我想做一个像下面这样的助手 def my_div some_options, &block # How do I print the result of the block? end 定义my_div一些选项和块(&block) #如何打印块的结果? 结束 yield语句将返回传递的块的结果。所以如果你想打印(控制台?) 将输出“某物” 但是: 你的方法是什么?输出DIV?您应该使用 def my_div(一些选项和块) #用字符串捕获块的值 内容=捕获(&block) #将值转换为输出

我想做一个像下面这样的助手

def my_div some_options, &block # How do I print the result of the block? end 定义my_div一些选项和块(&block) #如何打印块的结果? 结束

yield语句将返回传递的块的结果。所以如果你想打印(控制台?)

将输出“某物”

但是: 你的方法是什么?输出DIV?

您应该使用

def my_div(一些选项和块)
#用字符串捕获块的值
内容=捕获(&block)
#将值转换为输出
康卡特(内容)
结束
内容

def my_div(某些_选项和块) #用字符串捕获块的值
#并返回它。您必须使用所以有两件事很重要:

  • rails忽略任何不是
    content\u标记中的字符串的内容(以及
    content\u的
  • 您不能使用
    Array#join
    (等),因为它会生成不安全的字符串,您需要使用
    safe_join
    content_标记来生成安全字符串
  • 在我的情况下,我不需要
    capture
    concat
def map_连接(对象和块)
安全连接(对象、映射和块))
结束
def列表(对象和块)
如果没有?
内容标签(:p,“无”)
其他的
内容标签(:ul,类别:“光盘”)do
映射_连接(对象)do|对象|
内容标签(:li)do
block.call(对象)
结束
结束
结束
结束
结束
可以这样使用:

= list(@users) do |user|
  => render user
  = link_to "show", user 

(这很小,但也适用于erb)

weppos有一个更好的答案8)你不能使用“puts”在模板中输出内容,这只会输出到标准输出(例如在你的rails服务器终端日志中)
safe_join
提示真的救了我一命!我从来不知道这件事。最终与
+
连接,但很高兴知道。
def my_div(some_options, &block)
  # capture the value of the block a string
  content = capture(&block)
  # concat the value to the output
  concat(content)
end

<% my_div([]) do %>
  <p>The content</p>
<% end %>


def my_div(some_options, &block)
  # capture the value of the block a string
  # and returns it. You MUST use <%= in your view.
  capture(&block)
end

<%= my_div([]) do %>
  <p>The content</p>
<% end %>
def if_admin(options = {}, &block)
  if admin?
    concat content_tag(:div, capture(&block), options)
  end
end

<% if_admin(:style => "admin") do %>
<p>Super secret content.</p>
<% end %>
= list(@users) do |user|
  => render user
  = link_to "show", user