【问题标题】:what determines controller action ruby rails什么决定了控制器动作 ruby​​ rails
【发布时间】:2023-03-06 16:48:01
【问题描述】:

https://www.codecademy.com/en/courses/learn-rails/lessons/start/exercises/start-views,控制操作被描述为“pages#home”:

Well done! Now when a user visits http://localhost:8000/welcome, the route

get 'welcome' => 'pages#home'

will tell Rails to send this request to the Pages controller's home action.

但是当我制作控制器时,我做了rails generate controller Pages,它是大写的。

pages_controller.rb:

class PagesController < ApplicationController

  def home
  end

end
  1. pages#homepages部分是否由pages_controller.rb的第一部分确定,忽略_controller.rb结尾?

  2. 如果我将 pages_controller.rb 更改为 renamedpages_controller.rb 但将类名保留为 PagesController 会发生什么?

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    当发出类似http://localhost:8000/welcome 的请求时,它会匹配routes.rb 文件中的route,其中路由映射到controlleraction

    在您的路线文件中,您有:

    get 'welcome' => 'pages#home'
    

    get 'welcome' 部分与 url .../welcome 匹配,并将此请求映射到 pages#home,其中 pages 是控制器名称,home 是一个操作(pages_controller 中定义的方法)。这是 Rails 命名控制器的约定,如下所示:ControllerName_controller.rb。所以,基本上pages 是你的控制器的名字,最后一个_controllers 是你Rails 应用程序中每个控制器通用的。

    接下来发生的是,控制器的这个动作做了一些工作并与model/database 对话,并构建将传递给view 的所需变量/数据。根据 Rails 约定,必须有一个匹配的 view 文件,例如:home.html.erb,它将向浏览器呈现响应。

    还有其他方法可以以不同的方式呈现不同的partialsviews,但是如果您遵循 Rails 约定,那么在 Rails 中使用不同的模型、视图和控制器将变得非常容易理解和工作。这称为:约定优于配置。 当您遵循 Rails 命名约定时,Rails 会免费为您做很多工作和配置,让您的生活更轻松。

    当您的routes 文件中有get 'welcome' =&gt; 'pages#home' 时,当一个请求:/welcome 到来时,它会映射到pages_controller,它会在app/controller/ 下查找pages_controller.rb 文件。如果您将其重命名为其他名称,则程序将无法按预期找到它,并将向您抛出错误,并且您的请求将无法完成。

    您的控制器名称必须与该控制器的类名匹配,这也是 Rails 约定。如果您更改其中任何一个,那么您将收到错误并且您的请求将失败。

    【讨论】:

    • 很好的答案,但我必须选择另一个,因为它回答了两个部分。对不起
    【解决方案2】:

    Action Controller 是 MVC 中的 C。在路由确定了哪个控制器用于请求之后,您的控制器负责理解请求并产生适当的输出。幸运的是,Action Controller 为您完成了大部分基础工作,并使用智能约定让这一切尽可能简单。

    控制器命名约定

    Rails 中控制器的命名约定倾向于控制器名称中最后一个单词的复数形式,尽管这不是严格要求的(例如 ApplicationController)。例如,ClientsController 优于 ClientController,SiteAdminsController 优于 SiteAdminController 或 SitesAdminsController,等等。

    遵循此约定将允许您使用默认路由生成器(例如资源等),而无需限定每个 :path 或 :controller,并在整个应用程序中保持 URL 和路径助手的使用一致。见Rails Guides

    【讨论】:

      【解决方案3】:
      1. 是的。 #home 是 PagesController 中的“动作”
      2. 您收到 uninitialized constant PagesController 错误

      因此,您的控制器应始终采用name_controller.rb 中定义的NameController 形式,并将操作作为NameController 中的公共方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多