我现在已经使用 Ruby on Rails 创建了一些应用程序,但是有一些概念我还没有完全理解。
其中之一是“路由”过程如何工作?我的意思是,用户输入一个 URL 字符串,Rails 提供相关资产以响应 URL。
这是我认为正在发生的事情:
用户使用浏览器浏览服务器:
http://0.0.0.0:3000
然后他们在 URL 前面加上一个字符串:
http://0.0.0.0:3000/entries/view_all
Rails 的 'routes.rb' 文件通过指令指定字符串应该与什么实际相关:
match "/entries/view_all" => "entries#view_all"
上述指令表示,当字符串“/entries/view_all”附加到 URL 时,执行
view_all
在文件 'entries_controller.rb' 中找到的方法。view_all
方法执行:def view_all @entries = Entry.all(:order => 'created_at DESC') end
它将表 'Entry' 中的所有条目
@entries
按降序分配给常量。然后,Rails神奇地知道为用户提供“view_all.html.erb”。
each
'view_all.html.erb' 内的循环显示来自 'Entry' 表的相关信息:<% @entries.each do |entry| %> <h1><%= entry.title %></h1> <p><%= entry.content %></p> <p><em>Posted at <%= entry.created_at %></em></p> <% end %>
我的问题如下:
- 我对事物运作方式的概念有多错误?
- 在上面的第 3 步中,Rails 是如何知道
view_all
在 'entries_controller.rb' 中找到的方法的?该指令是entries#view_all
,不是entries#view_all
。Rails 是否会自动匹配“控制器”目录中控制器文件名的开头,并忽略“_controller.rb”? - 在上面的第 6 步中,Rails 是如何“神奇地”知道服务于“view_all.html.erb”视图的?它是否类似于我认为它在问题 #2 中的工作方式?Rails 是否将文件名的“view_all”部分与“entries_controller.rb”中的方法名匹配?
- object/constant
@entries
及其所有方法是如何从“entries_controller.rb”“传递”到“view_all.html.erb”的?