Rails多个动作共享一个视图

时间:2012-08-16 22:05:22

标签: ruby-on-rails

我有一个Rails控制器,其操作都共享一个类似的视图布局。我不想在几个不同的视图中复制代码,而是希望所有操作共享相同的视图(甚至可能来自另一个控制器的操作)。

我意识到这可以通过向每个动作添加render ...调用并告诉它使用相同的视图文件来实现,但是我有什么方法可以将它挂钩到一组动作中并避免在内部明确每一个人?

2 个答案:

答案 0 :(得分:2)

你能更好地解释为什么布局不起作用吗?我相信这段代码可以解决你的问题。

假设您有UsersController,并且您希望除new和create之外的所有操作都使用相同的视图。然后你可以很容易地做到:

def UsersController < ApplicationController
  layout "shared_layout", except: [:new, :create]
  layout "new_user_layout", only: [:new, :create]

  def show
    # Renders in app/views/layouts/shared_layout.html.erb
  end

  def index
    # Renders in app/views/layouts/shared_layout.html.erb
  end

  def new
    # Renders in app/views/layouts/new_user_layout.html.erb
  end

  def create
    # Renders in app/views/layouts/new_user_layout.html.erb
  end
end

然后,您可以创建一个布局,说明需要在共享中呈现的内容。在app/views/layouts/shared_layout.html.erb

<html>
  <body>
    <%= render "shared/shared_partial_1.html.erb" %>
    <%= render "shared/shared_partial_2.html.erb" %>
    <%= render "shared/shared_partial_3.html.erb" %>
    <%= yield %>
  </body>
</html>

这将以相同的方式为控制器的所有动作呈现部分1,2和3。这有什么问题?

答案 1 :(得分:0)

您有几个解决方案:

您可以在views/layout中专门为这些操作创建布局。

然后,您将在控制器中设置布局:

class LalasController < ApplicationController
    layout "your_action_layout"
end

当你提到render ...时,你可能会谈论这个问题,但你可以从偏见中创建迷你布局:

views/controller_names/my_layout

<div class="my-layout">
    <%= yield %>
</div>

然后,在你的每一个动作中,你都会这样做:

<%= render layout: "my_layout" do %>
    <div></div> <!-- All the code of your view -->
<% end %>