Ограничения маршрута: повышение исключения при отсутствии совпадения - PullRequest
0 голосов
/ 12 декабря 2018

Учитывая ограничение маршрута Rails, подобное этому:

class UserConstraint
  def matches?(request)
    User.where(code: request.path_parameters[:code]).any?
  end
end

Это не будет работать из-за подчиненного маршрута.

rout.rb :

constraints UserConstraint.new do
  get ':code', to: 'documents#index', as: :documents
  get ':code/*slug', to: 'documents#show', as: :document
end

Он просто возвращает следующее:

ActiveRecord::RecordNotFound:
Couldn't find User with 'slug'={:code=>"show"}

Разрешается ли это только с большим количеством ограничений?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Для тех, кто ищет ответ на что-то похожее, я решил это.Хотя @colincr не ошибается, это не совсем детализирует решение.

Если у вас есть сгущенные маршруты, как я, проще написать для них отдельные ограничения.

route.rb

constraints UserConstraint.new do
  get ':code', to: 'documents#index', as: :documents
end

constraints SlugConstraint.new do
  get ':code/*slug', to: 'documents#show', as: :document
end

user_constraint.rb

class UserConstraint
  def matches?(request)
    result = User.where(code: request.path_parameters[:code]).any?
    raise Errors::NoCode, 'User not found' unless result

    result
  end
end

slug_constraint.rb

class SlugConstraint
  def matches?(request)
    slug = "#{request.path_parameters[:code]}/#{request.path_parameters[:slug]}"
    result = Document.where(slug: slug).any?
    raise Errors::NoDocumentSlug, 'Document not found' unless result

    result
  end
end
0 голосов
/ 12 декабря 2018

Присвойте этот запрос переменной и сделайте что-то вроде этого:

raise <ExceptionClass> unless variable

...