我正在尝试让我的网址路径在我的Rails 4.1.7应用中看起来像这样:
http://localhost:3000/section/YYYY/MM/DD/article-title-goes-here
为了完成这项工作,我创建了一个迁移:
rails g migration add_slug_to_articles slug:string:uniq
rake db:migrate
然后我在我的article.rb模型中添加了以下内容:
class Article < ActiveRecord::Base
def to_param
slug
end
end
我用以下内容更新了数据库中的所有条目:
article.update(:slug => [article.section.downcase, article.created_at.strftime("%Y/%m/%d"), article.title.parameterize].join('/'))
但现在当我点击链接时,所有斜杠 / 都会被%2F 转义:
http://localhost:3000/articles/section%2F2014%2F11%2F10%2Farticle-title-goes-here
我一直在环顾四周,似乎有一个选择是monkeypatch ActionDispatch,但它对我来说似乎有点硬核,因为imo很常见。是不是有更清洁的方法来做到这一点?
答案 0 :(得分:0)
最好为您定义自定义非静态路由。 指南非常清楚地说明了如何操作:http://guides.rubyonrails.org/routing.html#non-resourceful-routes
这种方法可以让您通过章节,日期和标题过滤文章。
另一方面,你当前的方法看起来像是黑客。
答案 1 :(得分:0)
我通过以下方式解决了这个问题:
s = /section1|section2|section3|section4/
y = /\d{4}/
m = /\d{2}/
resources :articles, except: [:index, :show]
resources :articles, only: [:index, :show], path: '/:section/:year/:month', constraints: {:section => s, :year => y, month: m, slug: /[a-zA-Z0-9\-]+/}
get ':section/:year/:month', to: 'articles#by_month', as: :month, constraints: {section: s, year: y, month: m}
get ':section/:year', to: 'articles#by_year', as: :year, constraints: {section: s, year: y}
get ':section', to: 'articles#by_section', as: :section, constraints: {section: s}
然后在我的articles_controller.rb中我有
def by_section
..
end
def by_year
..
end
def by_month
..
end
def show
@article = Article.find_by_slug params[:slug]
end
唯一真正烦人的事情是我需要在视图中传递一堆参数:
<%= link_to @article.title, article_path(@article.section, @article.created_at.year, @article.created_at.month, @article.slug, @article.id) %>