Rails 5 Custom Routes: как создать собственный путь и заменить% 2F косой чертой - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть модель 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 на «/".

Я создал слагов в граблях:

  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'

1 Ответ

0 голосов
/ 03 сентября 2018

Я закончил тем, что изменил свой файл маршрутов следующим образом:

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

Затем я изменил скрипт 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: ''))

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

...