3

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

我意识到这可以通过添加render ...对每个操作的调用并告诉它使用相同的视图文件来完成,但是有什么方法可以将它挂钩到一组操作中并避免在每个操作中都显式?

4

2 回答 2

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。那有什么问题?

于 2012-08-17T17:12:31.833 回答
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 %>
于 2012-08-16T22:35:35.097 回答