ROR 应用程序如何选择在 return 行程中使用哪个视图?

How does an ROR app pick which View to use during the return trip?

目前正在 CodeAcademy 上学习 ROR,目前的流程:

  1. 创建 ROR 应用,
  2. 通过在 PagesCotnroller 中创建一个方法来修改 Controller class。
  3. 修改路由以将 'welcome' 请求指向 'pages#home' controller/method。
  4. (这是我感到困惑的地方,他们说:好的,现在是时候 mod 视图 (home.html.erb)...在文件夹 x/y/z 中找到它。但是在哪里在这个流程中,这个项目是否特别选择了 home.html.erb 文件与另一个视图。对于这个测试项目,文件夹中没有其他视图文件,但是如果有 20 个呢?我看到了第 2 步和第 3 步连接在代码中,那4呢?

这似乎是一个基本的问题,但我现在比较了解,然后在没有明确核心基础的情况下继续前进。

课程 link:https://www.codecademy.com/courses/learn-rails/

按照惯例。你甚至可以这样做:

# config/routes.rb
get `welcome`, to: 'pages#home'

# app/controllers/pages_controller.rb
class PagesController
end

# views/pages/home.html.erb
<h1>Hello world</h1>

由于 rails 是由 convention over configuration 的哲学驱动的,因此可以假设视图位于 pages/home.html.{erb|slim|haml}。如果在那里找不到视图,它会向上查找树并查找 views/home.html.{erb|slim|haml}。在这种情况下 ActionController::Base 将只渲染视图,即使控制器中没有任何动作。

默认情况下Rails 将在路由中指定的控制器名称中查找与控制器操作同名的视图。

所以您在 Pages 控制器下有 home 操作,这将导致 Rails 转到 home 操作,然后基于在操作中的代码上,它将呈现一个视图。

但您始终可以在控制器操作中指定要呈现的视图。最好有一个相似的名字,以免将来混淆。

PagesController < ApplicationController
  def home
    if five_min_window_is_still_open_after_creation?
      # you need to have app/views/pages/show_with_edit.html.erb
      render 'show_with_edit'
    elsif timeup?
      # you need to have app/views/pages/show_without_edit.html.erb
      render 'show_without_edit'
    # else 
      # it will render app/views/pages/home.html.erb
    end
  end
end

您也可以在 pages_controller.rb 的主页操作中呈现完全不同的视图

class PagesController < ApplicationController
 def home
  # renders app/view/books/home.html.erb
  render 'books/home'
 end
end