【问题标题】:Rails multiple actions share one viewRails 多个动作共享一个视图
【发布时间】:2012-08-16 22:05:21
【问题描述】:

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

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

【问题讨论】:

  • 这听起来你应该使用 before_filters。您的用例非常适合这一点。然后你会像 Robin 说的那样使用布局。
  • 我不明白 before_filters 如何帮助我进行渲染

标签: ruby-on-rails


【解决方案1】:

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

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

【讨论】:

  • 我想他想避免从他的应用程序布局(头部、页脚等)中复制代码,但是有了部分,它变得容易管理,我不知道更好的方法无论如何都要去做。
  • 好的,我重新审视了这个,它仍然在寻找动作模板文件。也就是说,加载 /users/index 仍然会查找views/users/index.html.erb,如果我共享所有这些视图,它将不存在。有什么想法吗?
【解决方案2】:

你有几个解决方案:

您可以在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 %>

【讨论】:

  • 就是这样,我不想像上一个示例那样在我的所有操作中都明确表示。我试图避免这种情况。我也希望避免布局路线,因为这意味着我需要重复我的 application.html.erb 中的所有内容
  • 好吧,如果您将应用程序布局拆分为多个部分,那么拥有另一个布局应该没什么大不了的。抱歉,我没有其他解决方案。
  • 是的,只是不知道。老实说,我认为没有其他解决方案(这就是我问它的原因)我会坚持等待任何其他回复,如果没有,则默认返回这种方式。非常感谢您的宝贵时间
  • 只需将应用程序布局中的所有通用代码捆绑到部分(_head.html.erb、_footer.html.erb 等)中,您就会发现它总体上是一个非常好的解决方案;)
猜你喜欢
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多