Это не проверено, но попробуйте использовать constraint
на вашем маршруте.
root :to => 'home#index'
match '/:id', :to => "properties#show",
:constraints => lambda { |r| Property.find_by_id(r.params[:id]).present? }
match '/:id', :to => "contests#show",
:constraints => lambda { |r| Contest.find_by_id(r.params[:id]).present? }
В качестве альтернативы, вы можете создать отдельный класс, который будет отвечать на matches?
вместо определения lambda
proc.(Я рекомендую размещать эти классы в отдельных файлах, которые будут автоматически загружаться в вашем приложении Rails.)
# app/constraints/property_constraint.rb
class PropertyConstraint
def self.matches?(request)
property = Property.find_by_id(request.params[:id])
property.present?
end
end
# app/constraints/contest_constraint.rb
class ContestConstraint
def self.matches?(request)
contest = Contest.find_by_id(request.params[:id])
contest.present?
end
end
# config/routes.rb
root :to => 'home#index'
match '/:id', :to => "properties#show", :constraints => PropertyConstraint
match '/:id', :to => "contests#show", :constraints => ContestConstraint
К сожалению, это приводит к дополнительному запросу БД (один раз на маршрутах и еще раз на вашем контроллере).Если у кого-то есть предложения по минимизации этого, пожалуйста, поделитесь.:)