繁体   English   中英

是什么决定控制器动作的红宝石导轨

[英]what determines controller action ruby rails

https://www.codecademy.com/zh-CN/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大写的rails generate controller Pages

pages_controller.rb:

class PagesController < ApplicationController

  def home
  end

end
  1. pages的一部分pages#home通过的第一部分确定pages_controller.rb ,无视_controller.rb结束了吗?

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

谢谢

当做出请求时,如: http://localhost:8000/welcome ,它相匹配的routeroutes.rb ,在此路由被映射到一个文件controller和一个action

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

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' => 'pages#home'时,则当请求: /welcome到来时,它将映射到pages_controller ,并会在app/controller/下查找pages_controller.rb文件。 如果将其重命名为其他名称,则程序将无法按预期找到它,并且将引发错误,并且您的请求将无法完成。

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

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

控制器命名约定

尽管并非严格要求,但Rails中控制器的命名约定倾向于对控制器名称中的最后一个单词进行复数处理(例如,ApplicationController)。 例如,ClientsController优于ClientController,SiteAdminsController优于SiteAdminController或SitesAdminsController,依此类推。

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

  1. 是。 #home#home中的“动作”
  2. 您收到uninitialized constant PagesController错误

因此,控制器应始终采用在NameController定义的name_controller.rb形式,并在name_controller.rb作为公共方法进行NameController

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM