2014-11-17 4 views
1

Я пытаюсь получить мои URL пути искать что-то подобное в моем Rails 4.1.7 приложения:Rails 4: Слэш от to_param slug сбежал?

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, но для меня это немного хардкор, для чего-то очень часто. Разве нет более чистого способа сделать это?

ответ

0

Лучше всего определить пользовательские не-спокойные маршруты для вас. Путеводители очень хорошо описывают, как это сделать: http://guides.rubyonrails.org/routing.html#non-resourceful-routes

Такой подход даст вам возможность фильтровать статьи через раздел, дату и название.

С другой стороны, ваш текущий подход выглядит как взломанный.

+0

Извинения за незнание, но я не могу понять, как бы я установил дату e от маршрутизации в том, как вы показали ... не могли бы вы объяснить? – DaniG2k

+0

что-то вроде этого: get 'articles /: section /: year /: month /: day /: title', to: 'articles # show' –

+0

Это означает, что мне всегда нужно передать 5 параметров любому методу link_to, который ссылается на статьи, верный? – DaniG2k

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 

Единственное действительно раздражает то, что мне нужно обойти кучу Params с каждой дорожкой на виды:

<%= link_to @article.title, article_path(@article.section, @article.created_at.year, @article.created_at.month, @article.slug, @article.id) %> 
Смежные вопросы