Rails 中漂亮(过时)的 RESTful URL

2024-03-07

我希望我的网站具有如下所示的 URL:

example.com/2010/02/my-first-post

我有我的Post模型与slug字段('我的第一篇文章')和published_on字段(我们将从中扣除 url 中的年份和月份部分)。

我想要我的Post模型是 RESTful 的,所以像url_for(@post)像他们应该的那样工作,即:它应该生成上述 url。

有没有办法做到这一点?我知道你需要覆盖to_param并有map.resources :posts with :requirements选项集,但我无法让它全部工作。


我已经快完成了,已经完成了 90%。使用资源黑客插件 http://github.com/stengland/resource-hacks-plugin我可以实现这个:

map.resources :posts, :member_path => '/:year/:month/:slug',
  :member_path_requirements => {:year => /[\d]{4}/, :month => /[\d]{2}/, :slug => /[a-z0-9\-]+/}

rake routes
(...)
post GET    /:year/:month/:slug(.:format)      {:controller=>"posts", :action=>"show"}

并在视图中:

<%= link_to 'post', post_path(:slug => @post.slug, :year => '2010', :month => '02') %>

生成正确的example.com/2010/02/my-first-post link.

我也希望这个工作:

<%= link_to 'post', post_path(@post) %>

但它需要覆盖to_param模型中的方法。应该相当容易,除了以下事实:to_param必须返回String, not Hash如我所愿。

class Post < ActiveRecord::Base
  def to_param
   {:slug => 'my-first-post', :year => '2010', :month => '02'}
  end
end

结果是can't convert Hash into String error.

这似乎被忽略了:

def to_param
  '2010/02/my-first-post'
end

因为它会导致错误:post_url failed to generate from {:action=>"show", :year=>#<Post id: 1, title: (...)(它错误地将 @post 对象分配给 :year 键)。我对如何破解它有点一无所知。


Rails 3.x 和 Rails 2.x 的漂亮 URL,无需任何外部插件,但不幸的是,有一些 hack。

路线.rb

map.resources :posts, :except => [:show]
map.post '/:year/:month/:slug', :controller => :posts, :action => :show, :year => /\d{4}/, :month => /\d{2}/, :slug => /[a-z0-9\-]+/

应用程序控制器.rb

def default_url_options(options = {})
  # resource hack so that url_for(@post) works like it should
  if options[:controller] == 'posts' && options[:action] == 'show'
    options[:year] = @post.year
    options[:month] = @post.month
  end
  options
end

post.rb

def to_param # optional
  slug
end

def year
  published_on.year
end

def month
  published_on.strftime('%m')
end

view

<%= link_to 'post', @post %>

请注意,对于 Rails 3.x,您可能需要使用以下路由定义:

resources :posts
match '/:year/:month/:slug', :to => "posts#show", :as => :post, :year => /\d{4}/, :month => /\d{2}/, :slug => /[a-z0-9\-]+/

有没有徽章可以回答您自己的问题? ;)

顺便说一句:路由测试 http://github.com/rails/rails/blob/master/actionpack/test/dispatch/routing_test.rb文件是查看 Rails 路由功能的好地方。

Update: Using default_url_options is a dead end。发布的解决方案仅在存在时才有效@post控制器中定义的变量。如果有,例如,@posts变量与帖子数组,我们运气不好(因为default_url_options无法访问视图变量,例如p in @posts.each do |p|.

所以这仍然是一个悬而未决的问题。有人帮忙吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 中漂亮(过时)的 RESTful URL 的相关文章

随机推荐

  • 如何从 MediaCodec 解码器的输出中提取 PCM 样本

    我正在尝试从解码的 mp4 缓冲区获取 PCM 样本以进行进一步处理 我首先从使用手机相机应用程序录制的视频文件中提取音轨 并且确保当我获得 audio mp4 mime 键时已选择音轨 MediaExtractor extractor n
  • Python 中日期的正则表达式:英国:日-月-年

    我正在尝试使用 python 编写一个 REGEX 来根据 英国 日 月 年 识别日期 我写了一些随机字符串 如下所示 string these are just rubbish 01 13 00 00 44 44 11 2 2222 24
  • 使用 CodeIgniter 的动态表单生成器[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我计划为不同的表单布局构建一个动态表单 http bootsnipp com forms version 3 http bootsnipp
  • python字典中的5个最大值

    我有一本这样的字典 A a 10 b 843 c 39 我想获取这个字典的 5 个最大值并用它存储一个新的字典 为了获得最大值 我做了 max A iteritems key operator itemgetter 1 0 也许这是一件容易
  • 有没有办法强制 conda install 安装软件包及其依赖项而不是给出错误

    我有一个正在安装软件包的 miniconda 环境 我想安装一个软件包 并且我知道可能会存在一些冲突 但是要解决这些冲突 要么需要安装缺少的软件包 要么需要降级 升级另一个软件包 并且它已成为一个尝试降级 升级和安装软件包的漫长兔子洞 有没
  • SSR 如何与 PWA 结合

    如何使用 PWA 渐进式 Web 应用程序 进行 SSR 服务器端渲染 据我了解 SSR SSR 运行时将加载页面并运行必要的脚本以将数据加载到页面上 然后返回渲染后的html 这对于不会运行 javascript 的网络爬虫和无脚本的浏览
  • 使用字符串访问属性

    给定一个与对象字段同名的字符串 如何获取对象字段的引用 例如 假设我向 GetFieldByStr 方法传入一个名为 field1 的字符串 并且该对象具有字段名称 field1 那么如何获取对 field1 对象的引用 我假设以某种方式使
  • 使用 Ratchet\Push.js 加载页面后执行自定义脚本

    所以在 GitHub 文档上棘轮2 0 2 https github com twbs ratchet我发现了以下说法 包含 JavaScript 的脚本标签将不会在以下页面上执行 加载了push js 如果您想将事件处理程序附加到 其他页
  • 负整数除法令人惊讶的结果

    在我的应用程序中 我遇到了以下情况并对结果感到惊讶 8 7 2 均为整数 这是什么意思 对于实际值 即8 0 7 0 结果大致为 1 143 使用整数除法的结果将向下舍入到更负的值 2 这也称为 楼层划分 这就是为什么你会得到一些令人困惑的
  • 如何获取字符串中单词的所有组合

    我想获得字符串中所有相邻单词的组合 例如 细绳get all combinations我想要得到 get all combinations all combinations get all all get combinations 我写下一
  • SQL 多个 where 子句

    我找不到像这样使用多个 where 子句是否有效 我使用 JPA MySQL 我需要多个 where 子句 其中一个在这里是 not 还是我遗漏了一些东西 select d from T DEBIT d where d status PEN
  • 更改 UIView 的边界并使 UICollisionBehavior 对其做出反应

    是否可以更改 UIView 的边界 使用 UIAttachmentBehaviors 附加到其他一些 UIView 并使 UICollisionBehavior 与 UIAttachmentBehavior 相结合对其做出响应 如此处的示例
  • 在 Go 中解组通用 json [重复]

    这个问题在这里已经有答案了 我是一名新的 Go 程序员 来自 Java 我想重现一种易于在 Java 中使用的通用方法 我想创建一些函数 允许我对 JSON 字符串执行 Unmarshal 以避免代码重复 这是我当前不起作用的代码 type
  • java.sql.SQLException:连接已关闭

    我们正在得到java sql SQLException 连接已关闭 执行事务时间歇性出现异常 我们使用的是 tomcat 7 X 下面是配置
  • .Net C# RESTSharp 10 分钟超时

    我已将浏览器控件嵌入到 Net 表单中 并将其编译为窗口的可执行文件 浏览器控件正在显示我们的 HTML5 图像查看器 该应用程序打开套接字 以便它可以侦听来自各个服务器的 推送 请求 这允许将图像推送到单个用户的桌面 当传入图像推送请求时
  • 熊猫:组内最大值和最小值之间的差异

    给定一个如下所示的数据框 GROUP VALUE 1 5 2 2 1 10 2 20 1 7 我想计算每组内最大值和最小值之间的差异 也就是说 结果应该是 GROUP DIFF 1 5 2 18 在 Pandas 中执行此操作的简单方法是什
  • git 有一个损坏的丢失对象,无法修复

    git commit error inflate data stream error incorrect data check error corrupt loose object 26f0654cde5d83f2ed8d971474d9d
  • 如何在 Racer / DerbyJS 上创建服务器端应用程序逻辑?

    我正在学习新的细节DerbyJS http derbyjs com堆栈 我找不到将应用程序逻辑放在服务器端的方法 声明的意图是所有代码都应该能够在服务器和客户端中运行 但是 我需要隐藏某些数据 并且仅在根据用户会话信息进行身份验证时才将其发
  • Neo4j Spatial over REST 通过 JAVA API 不起作用(对我来说)

    我正在 Neo4J 上开发 Grails 应用程序 我还想将其导出为 GIS 数据库 查看如何在 GeoServer uDig 中使用 neo4j 的示例 似乎空间集成仅通过嵌入式 neo4j 数据库进行 有谁知道是否可以进行设置 以便我的
  • Rails 中漂亮(过时)的 RESTful URL

    我希望我的网站具有如下所示的 URL example com 2010 02 my first post 我有我的Post模型与slug字段 我的第一篇文章 和published on字段 我们将从中扣除 url 中的年份和月份部分 我想要