gpt4 book ai didi

ruby-on-rails - Rails 中漂亮(过时)的 RESTful URL

转载 作者:行者123 更新时间:2023-12-04 06:22:05 25 4
gpt4 key购买 nike

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

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

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

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

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

我已经快完成了,我已经完成了 90%。使用 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"}

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

生成正确的 example.com/2010/02/my-first-post关联。

我也希望这样做:
<%= link_to 'post', post_path(@post) %>

但它需要覆盖 to_param模型中的方法。应该相当容易,除了 to_param必须返回 String ,不是 Hash正如我所愿。
class Post < ActiveRecord::Base
def to_param
{:slug => 'my-first-post', :year => '2010', :month => '02'}
end
end

结果 can't convert Hash into String错误。

这似乎被忽略了:
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 不需要任何外部插件,但不幸的是有一点小技巧。

路由文件

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

应用 Controller .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

后.rb
def to_param # optional
slug
end

def year
published_on.year
end

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

看法
<%= 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\-]+/

是否有任何徽章可以回答您自己的问题? ;)

顺便说一句: routing_test文件是查看您可以使用 Rails 路由做什么的好地方。

更新:使用 default_url_options死胡同 .发布的解决方案仅在存在 @post 时才有效 Controller 中定义的变量。例如,如果有 @posts带有帖子数组的变量,我们不走运(因为 default_url_options 无法访问 View 变量,例如 p 中的 @posts.each do |p|

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

关于ruby-on-rails - Rails 中漂亮(过时)的 RESTful URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2258321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com