Routes Resource

本文介绍如何使用Rails框架中的resource和collection方法简化路由配置。通过这些方法,可以减少手动定义路由的工作量,并保持代码整洁。文章详细解释了两种方法的工作原理及用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文地址:http://blog.youkuaiyun.com/spch2008/article/details/9005140


当路由条目过多时,需要一条一条注册,过于麻烦,此时可以通过resource route简化

map.connect("messages", "/messages",
    controller="messages", action="create",
    conditions=dict(method=["POST"]))
map.connect("messages", "/messages",
    controller="messages", action="index",
    conditions=dict(method=["GET"]))
map.connect("formatted_messages", "/messages.{format}",
    controller="messages", action="index",
    conditions=dict(method=["GET"]))
map.connect("new_message", "/messages/new",
    controller="messages", action="new",
    conditions=dict(method=["GET"]))
map.connect("formatted_new_message", "/messages/new.{format}",
    controller="messages", action="new",
    conditions=dict(method=["GET"]))
map.connect("/messages/{id}",
    controller="messages", action="update",
    conditions=dict(method=["PUT"]))
map.connect("/messages/{id}",
    controller="messages", action="delete",
    conditions=dict(method=["DELETE"]))
map.connect("edit_message", "/messages/{id}/edit",
    controller="messages", action="edit",
    conditions=dict(method=["GET"]))
map.connect("formatted_edit_message", "/messages/{id}.{format}/edit",
    controller="messages", action="edit",
    conditions=dict(method=["GET"]))
map.connect("message", "/messages/{id}",
    controller="messages", action="show",
    conditions=dict(method=["GET"]))
map.connect("formatted_message", "/messages/{id}.{format}",
    controller="messages", action="show",
    conditions=dict(method=["GET"]))

上述路由条目可以使用这一条语句代替。

map.resource("message", "messages")	
两个参数,一个指定单数,为member路由名字;一个指定复数,为collection路由名字。

函数原型:resource(member_name, collection_name, **kwargs)


GET    /messages        => messages.index()    => url("messages")
POST   /messages        => messages.create()   => url("messages")
GET    /messages/new    => messages.new()      => url("new_message")
PUT    /messages/1      => messages.update(id) => url("message", id=1)
DELETE /messages/1      => messages.delete(id) => url("message", id=1)
GET    /messages/1      => messages.show(id)   => url("message", id=1)
GET    /messages/1/edit => messages.edit(id)   => url("edit_message", id=1)


这里有必要说一下member 路由与 collection路由。

上述的路由模型

GET    /messages        => messages.index()   
POST   /messages        => messages.create()  
GET    /messages/new    => messages.new()     
PUT    /messages/1      => messages.update(id)
DELETE /messages/1      => messages.delete(id)
GET    /messages/1      => messages.show(id)  
GET    /messages/1/edit => messages.edit(id) 

1. 有的路由有id, 指向一个具体的对象
2. 有的路由没有id, 指向全体对象
3. 有的路由(index/create, show/update/delete)有相同的URL,但是HTTP method不同
4. 有的路由(show/edit)HTTP method和前缀相同,仅后缀不同


一个member路由指定具体实例,也就是说它们有id。而一个collection路由,
没有指定的实例,即没有给定id
综上:member路由操作一个单独的实例,而collection操作全体实例。


另一个函数collection也可以完成上述功能。

函数原型:collection(collection_name, resource_name, path_prefix=None, member_prefix='/{id}', controller=None, collection_actions=['index', 'create', 'new'],member_actions=['show', 'update', 'delete', 'edit'], member_options=None, **kwargs)


用法:

map.collection('entries', 'entry')


### 关于前端 URL 请求中 “No static resource adminLogin” 错误的分析与解决 此错误通常表明服务器未能找到名为 `adminLogin` 的静态资源或映射路径。这可能是因为以下原因之一:路径未被正确注册到路由配置中,或者控制器方法缺失导致请求无法匹配任何处理逻辑。 #### 1. 验证路径是否已正确定义 首先需要确认 `/adminLogin` 是否已被定义为有效的 HTTP 请求路径。根据引用中的描述[^2],目前仅存在一个简单的控制器 (`IndexController`) 将根路径和 `/login` 映射到了登录页面。然而,对于自定义路径如 `/adminLogin` 并没有任何显式的声明。这意味着如果尝试访问该路径而没有对应的处理器函数,则会出现类似的错误消息:“No static resource”。 为了支持新的路径 `/adminLogin`,应该创建一个新的 Controller 方法来专门处理此类请求。下面展示了一个示例实现方式: ```java @Controller public class AdminController { @GetMapping("/adminLogin") public String handleAdminLogin() { // 返回视图名称给模板引擎渲染 return "admin-login"; } } ``` 在这个例子中,我们新增加了一个叫作 `AdminController` 的类,并在其内部定义了针对 GET 类型请求 `/adminLogin` 的响应行为——即跳转至名为 `admin-login.html` 的视图文件。 #### 2. 更新路由配置以包含更多灵活性 除了单独设置每个独立的功能模块外,还可以考虑利用更灵活的方式管理整个应用内的所有可用端点。例如,在 ASP.NET MVC 架构下可以通过修改全局范围内的默认路由模式使得未知参数能够被捕获并传递给相应的动作执行者[^3]。虽然这里是基于 Java Spring Framework 的讨论场景,但概念相似之处在于都需要确保所有的潜在合法 URI 形式都被适当考虑到系统设计当中去。 假设希望沿用 RESTful 设计风格的话,则可调整现有的 RouteConfig 设置如下所示: ```csharp routes.MapRoute( name: "Custom", url: "{module}/{action}", defaults: new { controller = "Home", action = "Index" } ); ``` 此处我们将原有的固定形式替换成了更加通用化的 `{module}/{action}` 结构,允许任意组合作为输入条件的一部分参与最终目标位置的选择过程之中。当然实际运用时还需要结合具体情况做出相应适配改动才行。 #### 3. 检查视图是否存在及其命名一致性 最后一步也是至关重要的环节就是核实所指定的目标视图确实存在于预期目录之下并且其名字完全吻合调用约定的要求。按照前述给出的例子来看,默认情况下Spring Boot会寻找位于 `resources/templates/` 下面叫做 `admin-login.html` 的HTML文档用来呈现结果界面。所以务必保证有这样一个文件存在于此处以便顺利完成整个流程闭环操作。 --- ### 总结 通过对以上几个方面的逐一排查可以有效定位并修复“No static resource adminLogin”的问题根源所在。主要包括但不限于增加专用控制层组件负责特定业务逻辑分支;优化现有导航体系架构提高整体适应能力;同时也要注意基础素材准备工作的完整性以免遗漏造成不必要的麻烦。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值