6

我正在尝试使用yieldand创建动态内容content_for。基本上我有一堆布局。而且我不想为每个布局创建一堆视图。我想在需要时渲染视图部分。对于代码的不同部分,没关系。但是我对不同内容的相同部分有问题。

在我的application.html.erb

<%= yield %>
<%= yield :name_section %>

在我的show.html.erb我有;

<% content_for :name_section do %>
    <b>Name:</b>
    <%= @post.name %>
<% end %>

这是问题;

如果我想要多个具有不同内容的 name_section 怎么办。我是说; 我想在:name_section不同的地方放置不同的内容。

例如;

<table>
  <tr>
    <td>
      <%= yield :name_section %>
    </td>
  </tr>
  <tr>
    <td>
      <%= yield :name_section %>
    </td>
  </tr>
</table>

有任何想法吗?

谢谢你。恰达什

4

3 回答 3

8

我相信你所要求的现在是可能的:

# The template
<%= render layout: "my_layout" do |customer| %>
  Hello <%= customer.name %>
<% end %>

# The layout
<html>
  <%= yield Struct.new(:name).new("David") %>
</html>

来自: http ://api.rubyonrails.org/classes/ActionView/Helpers/RenderingHelper.html#method-i-_layout_for

希望这可以帮助其他人寻找相同的解决方案。

于 2014-06-03T00:15:57.080 回答
2

以下解决方案对我来说效果很好。它不允许您传递 args,但是如果在调用之前content_for(第二次),您将 args 分配给实例变量,这允许您在content_for. 基本思想是content_for在第一次调用内容时生成内容,然后该内容保持静态,但此解决方法会延迟静态内容生成,直到您准备好显示内容。

首先,将此函数添加到您的帮助模块:

def immediate_content_for name, content = nil, &block
  @immediate_content ||= {}
  if content || block_given? then
    @immediate_content[name] = Proc.new { content_for name, content, &block }
    nil
  else
    @immediate_content[name].call
    content_for name
  end
end

然后,假设您想传递arg1content_for. 您现在可以这样做:

<% content_for :my_form %>
  <%= some_helper_function(@arg1) %>
<% end %>

然后,稍后在您的代码中,在您定义之后arg1

<%= @arg1 = arg1 %>
<%= content_for :my_form %>

从某种意义上说,这是一种黑客行为,我不能保证 的行为immediate_content_for在所有其他方面与 的行为相同content_for,并且如果content_for某些未来版本的 rails 中的行为发生变化,immediate_content_for则需要对其进行更新继续镜像content_for。尽管它不是最佳解决方案,但它现在可以完成工作。

于 2012-09-10T16:14:14.220 回答
2

鉴于文档:

http://api.rubyonrails.org/classes/ActionView/Helpers/RenderingHelper.html#method-i-_layout_for

和方法的源代码(你可以在那里浏览):

def _layout_for(*args, &block)
  name = args.first

  if block && !name.is_a?(Symbol)
    capture(*args, &block)
  else
    super
  end
end

yield你所要求的在布局中是不可能的。

于 2012-05-25T11:26:23.060 回答