Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么Rails将布局选择作为控制器关注点而不是视图关注点?我可以从视图中选择布局吗?_Ruby On Rails_Layout - Fatal编程技术网

Ruby on rails 为什么Rails将布局选择作为控制器关注点而不是视图关注点?我可以从视图中选择布局吗?

Ruby on rails 为什么Rails将布局选择作为控制器关注点而不是视图关注点?我可以从视图中选择布局吗?,ruby-on-rails,layout,Ruby On Rails,Layout,也许有技术/实现方面的原因,但在我看来,“布局”是视图层中最明显的一部分,然而Rails似乎只允许在控制器级别指定布局 我的控制器不应该关心布局。。。模板应该是。有没有办法从.erb文件中指定要使用的布局 比如: <%= with_layout :news_feed do %> <p> My markup in here. </p> <% end %> 现在,假设您的ActionController具有: class Appl

也许有技术/实现方面的原因,但在我看来,“布局”是视图层中最明显的一部分,然而Rails似乎只允许在控制器级别指定布局

我的控制器不应该关心布局。。。模板应该是。有没有办法从.erb文件中指定要使用的布局

比如:

<%= with_layout :news_feed do %>

  <p>
    My markup in here.
  </p>

<% end %>
现在,假设您的ActionController具有:

class ApplicationController < ActionController::Base
  layout nil
class ApplicationController
然后,每个模板都可以使用这种方法选择自己的布局

如果您在app/layouts中放置一个布局,并且其名称与控制器匹配,则将使用该布局,因此您不必严格指定它们是否都相同。不管怎样,编写模板的人现在可以完全控制模板,而不是编写控制器的人:)

一些语句:

布局是关于渲染的。
布局只能调用一次。
视图-是渲染的最高(最后)级别。
控制器-是第一级渲染层

所以我可以说,我们唯一可以设置布局的地方是控制器。如果我们可以从视图设置布局,那么嵌套布局就会出现问题,因为每个视图(部分视图)都会调用自己的布局

控制器设置布局的方式简单明了。如果我们从它的子级设置父级视图,这是不清楚和混乱的


你说的是什么?是产生(
content\u for
)和部分(
render:partial
)。这是一个非常好的工具,它们工作得非常完美。

我做了一些研究,但没有找到任何类似于您所寻找的解决方案

我认为这可能与以下事实有关:可以通过在
app/views/layouts
下命名文件
your\u controllers\u name.html.erb
来指定默认布局以外的布局。如果特定控制器始终使用相同的布局,则这可以删除控制器中的任何逻辑。也许这就是你要找的?如果布局没有匹配的控制器名称,则将使用默认的
application.html.erb


如果需要有条件地呈现不同的布局,则需要在控制器中做出该决定。否则,你会将决策逻辑推到你的视野中。您的视图不必决定它需要什么样的布局,因为控制器在那里可以做出决定并设置视图所需的任何必要数据。

我不同意这是控制器的问题。这可能是最简单的解决方案,但布局基本上是模板的一部分;它与控制器无关。我知道我们把它放在控制器里。。。但是这是Rails的东西,而不是MVC的东西。另外,关于嵌套布局,很可能有子布局,比如在内容周围绘制框等等。。。它基本上只是说:“我将生成一些内容,我希望这个文件能够呈现这些内容”。该文件是否包含标记和其他顶级内容既不在这里也不在那里;)@d11wtq,
用于在内容周围绘制框等
这正是partials所做的。你根本不需要次级布局。布局-是没有任何子布局的单个文件。子布局是局部的。控制器关注的是选择一个布局作为渲染的起点。实际上,控制器所做的是渲染。所以选择布局是控制器的工作。谢谢,是的,我从文档中得到了这个,但它看起来真的有点奇怪。我们的团队很明显分为设计师和开发人员,设计师不应该接触我们的控制器。也许我们会退回到使用一个包含前端人员所包含的顶部和底部部分的空布局。或者我会研究一种解决方案,它允许使用_layout
块执行
。我们有四个或五个“标准”布局,它们不一定与任何特定的控制器关联。。。这取决于页面内容。@d11wtq-我知道您来自哪里,尽管您的设计师仍然不需要触摸控制器代码,对吗?他们可以在layouts目录中创建布局,然后开发人员可以根据需要添加任何条件代码。一般来说,虽然您可能在95%的时间内不使用控制器命名约定方案。@d11wtq,但您发布的代码块解决了您的问题吗?如果是这样,你真的应该把它作为一个答案,这样你就可以把它标记为答案。
class ApplicationController < ActionController::Base
  layout nil