如何创建带有块的助手?

发布于 2024-07-25 08:05:30 字数 118 浏览 3 评论 0原文

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

def my_div some_options, &block
  # How do I print the result of the block?
end

I want to make a helper like the following.

def my_div some_options, &block
  # How do I print the result of the block?
end

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

烟酒忠诚 2024-08-01 08:05:30

您应该使用 CaptureHelper

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 %>

如果需要连接输出,请使用 capture + concat。
如果您需要捕获然后重用内容,请使用捕获。 如果您的块没有明确使用 <%=,那么您必须调用 concat (首选方式)。

这是如果用户不是管理员则隐藏内容的方法示例。

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 %>

You should use CaptureHelper.

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 %>

Use capture + concat if you need to concat the output.
Use capture if you need to capture and then reuse the content. If your block doesn't explicitely use <%=, then you MUST call concat (preferred way).

This is an example of a method that hides the content if the user it not an admin.

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 %>
維他命╮ 2024-08-01 08:05:30

所以有两件事很重要:

  • rails 会忽略 content_tag(和 content_for)中不是字符串的任何内容,
  • 您不能使用 Array#join (等),因为它会产生不安全的字符串,所以您需要使用 safe_joincontent_tag 来获得安全字符串,
  • 我也不需要 capture > 或 concat 在我的例子中。
  def map_join(objects, &block)
    safe_join(objects.map(&block))
  end

  def list(objects, &block)
    if objects.none?
      content_tag(:p, "none")
    else
      content_tag(:ul, class: "disc") do
        map_join(objects) do |object|
          content_tag(:li) do
            block.call(object)
          end
        end
      end
    end
  end

可以像这样使用:(

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

这很苗条,但也可以与 erb 配合使用)

so two things that are important:

  • rails ignores anything that isn't a string in a content_tag (and content_for)
  • you can't use Array#join (etc.) because it produces unsafe strings, you need to use safe_join and content_tag to have safe strings
  • I didn't need either capture or concat in my case.
  def map_join(objects, &block)
    safe_join(objects.map(&block))
  end

  def list(objects, &block)
    if objects.none?
      content_tag(:p, "none")
    else
      content_tag(:ul, class: "disc") do
        map_join(objects) do |object|
          content_tag(:li) do
            block.call(object)
          end
        end
      end
    end
  end

this can be used like this:

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

(this is slim but works fine with erb too)

匿名。 2024-08-01 08:05:30

http://www.rubycentral.com/book/tut_containers.html

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

def my_div &block
  yield
end

my_div { puts "Something" } 

会输出“Something”

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

http://www.rubycentral.com/book/tut_containers.html

The yield statement will return the result of the block passed. So if you wanted to print (console?)

def my_div &block
  yield
end

my_div { puts "Something" } 

Would output "Something"

But:
What is the idea of your method? Outputting a DIV?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文