在Rails 5中添加共享视图文件的位置?

Amr*_*ngh 4 ruby ruby-on-rails ruby-on-rails-5

我正在使用Rails 5,我想在我的项目中使用共享文件.我在网上搜索了这个,我得到了一些结果如下:

对于Rails 3

app/views/shared
Run Code Online (Sandbox Code Playgroud)

对于Rails 4

app/views/application
Run Code Online (Sandbox Code Playgroud)

但Rails 5没有任何内容.

我在谈论标准; 是否有任何特定的位置在Rails 5中添加常见的视图文件,就像我们在其他框架中一样?像在Laravel中有一个布局文件夹?

Pau*_*nti 6

所有人都告诉你,普通视图文件没有"标准位置"是正确的.但是,如果您想询问Rails,如果您尝试在视图上渲染部分文件,它将寻找部分文件,只需获取您拥有的任何视图文件并渲染您知道不存在的部分文件.

如果你有一个UsersController看起来类似的视图结构,app/view/users你在任何视图上添加以下内容:

<%= render 'foo' %>
Run Code Online (Sandbox Code Playgroud)

您可能会收到类似以下内容的错误:

Missing partial users/_foo, application/_foo
Run Code Online (Sandbox Code Playgroud)

这意味着每当您尝试使用它的名称呈现部分而没有任何路径信息时,Rails将会查找它

  • 在这种情况下,首先在当前控制器的视图目录下 users
  • 然后在application目录下

所以,我想你可以说Rails中普通视图文件的"默认位置"在application目录下.

通过覆盖ActionView::ViewPaths.local_prefixes混合到Rails中每个控制器的私有类方法,可以添加到此以便为公共视图文件创建应用程序自己的"标准位置" :

class ApplicationController < ActionController::Base
  def self.local_prefixes
    ['shared', controller_path]
  end
  private_class_method :local_prefixes
end

class UsersController < ApplicationController
  def self.local_prefixes
    [controller_path]
  end
  private_class_method :local_prefixes
end
Run Code Online (Sandbox Code Playgroud)

现在,您的错误会说:

Missing partial users/_foo, shared/_foo, application/_foo
Run Code Online (Sandbox Code Playgroud)

这表明Rails会在查看shared目录之前检查目录的部分内容application.

请注意,此方法覆盖应该在两个控制器中发生,否则local_prefixesin UsersControllerget继承ApplicationController并最终得到重复的查找路径,如下所示:

shared/_foo, users/_foo, shared/_foo, application/_foo
Run Code Online (Sandbox Code Playgroud)

如果所有这些都太费力/太奇怪,正如其他人指出的那样,在呈现部分时,您总是可以手动指定共享的部分目录:

<%= render 'shared/foo' %>
Run Code Online (Sandbox Code Playgroud)