![](/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.