Rails 4:来自to_param slug的斜线被逃脱了?

时间:2014-11-17 21:47:06

标签: ruby-on-rails routing

我正在尝试让我的网址路径在我的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很常见。是不是有更清洁的方法来做到这一点?

2 个答案:

答案 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) %>