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