【发布时间】:2014-08-20 08:08:11
【问题描述】:
在 Rails 4 中还有另一种更简洁的方式来实现路由,例如:
/blog/2014/8/blog-post-title
/blog/2014/8
/blog/2014
/blog/2014/8/tags/tag-1,tag-2/page/4
/blog/new OR /blog_posts/new
我使用FriendlyId(以及acts-as-taggable 标记参数和kaminari 页面参数)尝试了以下操作:
blog_post.rb
extend FriendlyId
friendly_id :slug_candidates, use: [:slugged, :finders]
def to_param
"#{year}/#{month}/#{title.parameterize}"
end
def slug_candidates
[
:title,
[:title, :month, :year]
]
end
def year
created_at.localtime.year
end
def month
created_at.localtime.month
end
routes.rb
match '/blog_posts/new', to: 'blog_posts#new', via: 'get'
match '/blog_posts/:id/edit', to: 'blog_posts#edit', via: 'get'
match '/blog_posts/:id/edit', to: 'blog_posts#update', via: 'post'
match '/blog_posts/:id/delete', to: 'blog_posts#destroy', via: 'destroy'
match '/blog(/page/:page)(/tags/:tags)(/:year)(/:month)', to: 'blog_posts#index', via: 'get'
match '/blog/:year/:month/:title', to: 'blog_posts#show', via: 'get'
resources 'blog', controller: :blog_posts, as: :blog_posts
已使用资源,因此可以正常使用路径和 url 助手。
这可行(减去更新),但感觉非常难看。有没有更好的办法?
【问题讨论】:
-
你不需要资源中包含的新建、编辑、更新、销毁路由...
-
我需要这些,所以它是
/blog_posts/action而不是/blog/action,否则它会将操作解释为年份参数,例如year="new"。也许对于这些路由定义还有另一种方法?
标签: ruby-on-rails routing friendly-id