![](/img/trans.png)
[英]What would cause an action in my Ruby on Rails controller to be called repeatedly?
[英]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
在pages
的一部分pages#home
通过的第一部分确定pages_controller.rb
,无视_controller.rb
结束了吗?
如果我将pages_controller.rb
更改为renamedpages_controller.rb
但将类名保留为PagesController,会发生什么?
谢谢
当做出请求时,如: http://localhost:8000/welcome
,它相匹配的route
在routes.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
,它将响应呈现给浏览器。
还有其他方法可以以不同的方式呈现不同的partials
和views
,但是如果您遵循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指南 。
#home
是#home
中的“动作” uninitialized constant PagesController
错误 因此,控制器应始终采用在NameController
定义的name_controller.rb
形式,并在name_controller.rb
作为公共方法进行NameController
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.