Рельсы: Находчивые маршруты, использующие либо UUID, либо Slug

#ruby-on-rails

Вопрос:

В моем приложении Rails я хочу разрешить своим находчивым маршрутам получать запись либо с помощью параметра UUID, либо с помощью Slug.

В принципе, я хочу /users/aafdbc47-b427-4be9-bf4b-4b6c4e9b8303 или /users/sireltonjohn хочу работать. Это два отдельных поля в моей схеме, UUID и Slug соответственно. В первую очередь, поэтому у меня есть неизменяемая прямая ссылка на пользователя (поскольку пользователь может изменить свой слиток).

Я относительно новичок в Rails, поэтому пытаюсь понять, как в моем файле routes.rb разрешить работу этого маршрута.

Ответ №1:

Оба /users/aafdbc47-b427-4be9-bf4b-4b6c4e9b8303 и /users/sireltonjohn направляются к users/:id тому, от чего происходит show действие UsersController (если мы следуем по рельсовым конвейерам)

Вот простой способ сделать это (написал это от ума)

 # app/controllers/users_controller.rb
class UsersController < ApplicationRecord
  before_action :find_user, only: :show

  def show
    p @user
  end

  private
  
  def find_user
    @user = User.where('uuid = :key OR slug = :key', key: params[:id]).first
  end 
end

# routes.rb
resources :users
 

Вы могли бы проверить friendly_id, посмотреть, подходит ли он вам.