Rails 5 Custom Routes: как создать собственный путь и заменить %2F косой чертой

У меня есть модель School, и вместо того, чтобы иметь URL-адрес schools/1, я хотел бы иметь URL-адрес localhost:3000/IL/city/school_name.

Я подписался на это руководство для создания настраиваемых маршрутов с помощью слагов, но конечным результатом является URL-адрес, который выглядит следующим образом:

http://localhost:3000/schools/IL%2Fcicero%2Fabe-lincoln-elem-school

Я хотел бы сделать две вещи: 1. удалить «школы» с маршрута и 2. заменить %2F на «/».

Я создал слаги в задаче rake следующим образом:

  def to_slug(string)
    string.parameterize.truncate(80, omission: '')
  end

  slugs = []
  School.find_each do |school|
    slug = "#{school.state}/#{to_slug(school.city)}/#{to_slug(school.name)}"
    if slugs.include?(slug)
      slug = slug + "-2"
      p "Same Name"
    end
    p slug
    slugs << slug
    school.slug = slug
    school.save
  end

В моей школьной модели:

def to_param
    slug
  end

В моих маршрутах.rb:

resources :schools, param: :slug

Наконец, в моем контроллере в действии show:

@school = School.find_by_slug(params[:slug])

Я новичок и далеко за пределами моего набора навыков. Я много читал о маршрутах, и кажется, что мне нужно что-то вроде этого в маршрутах:

get ':state/:city/:slug', to: 'schools#show'

Я пробовал это безрезультатно:

resources schools, except: show, param :slug

 get ':state/:city/:slug', to: 'schools#show'

person tomb    schedule 01.09.2018    source источник
comment
Используйте гем friendly_id, возможно, это поможет вам получить желаемые маршруты.   -  person Anand    schedule 01.09.2018
comment
Вероятно, это связано с тем, что строки по умолчанию не помечены как безопасные для html. Вы можете переопределить геттер School#slug и пометить его как html безопасный super.html_safe, однако, если ваш слаг содержит пользовательский контент, вы можете не захотеть этого делать.   -  person 3limin4t0r    schedule 03.09.2018


Ответы (1)


В итоге я изменил файл маршрутов следующим образом:

resources :schools, :only => [:index, :new, :create, :edit]
resources :schools, :only => [:show], path: 'IL/:city/', param: :slug

Затем я изменил сценарий слагов, чтобы удалить бит «IL/city» (и снова запустил эту задачу rake, чтобы обновить слаги):

  def to_slug(string)
    string.parameterize.truncate(80, omission: '')
  end

  slugs = []
  School.find_each do |school|
    slug = to_slug(school.name)
    if slugs.include?(slug)
      slug = slug + "-2"
      p "Same Name"
    end
    p slug
    slugs << slug
    school.slug = slug
    school.save
  end

а затем везде, где было link_to(school.name, school), мне пришлось измениться, чтобы выглядеть так:

link_to(school.name, school_path(slug: school.slug, city: school.city.parameterize.truncate(80, omission: ''))

Я уверен, что есть лучший способ сделать это, но это работает на данный момент.

person tomb    schedule 03.09.2018