У меня есть подстановочный маршрут в моем routes.rb
файле:Rails ограничить подстановочный маршрут к определенному формату
get "*client" => "client#show"
В контроллере, я смотрю на клиент в базе данных и отображать их пользовательские страницы:
def show
@client = Client.find_by(slug: params[:client])
if @client.nil?
render file: "client/404", layout: "error", status: :not_found
return
end
end
Это прекрасно работает, но моя проблема заключается в том, что любой актив, который не найден, также маршрутизируется через мой client#show
обработчик.
Это приводит к бессмысленному поиску в базе данных для клиента, а затем я получаю ошибку 500, поскольку Rails не знает, как отображать мою страницу ошибок для не-html-форматов.
Мой вопрос: Как я могу предотвратить использование неформатных форматов HTML в моем подстановочном коде?
Я попытался следующие без толку:
Формат Constraint
Обрамление рамки вокруг маршрута, чтобы ограничить его в формат HTML:
scope :format => true, :constraints => { :format => 'html' } do
get "*client" => "client#show"
end
Это делает не позволять активам перенаправляться на мой обработчик, но, к сожалению, только перенаправляет страницы на обработчик, если они явно заканчиваются расширением .html
. Провал.
Формат по умолчанию
Далее, я думал, что попробовать формат по умолчанию. Например:
get "*client" => "client#show", :defaults => { :format => 'html' }
К сожалению, до сих пор нет сотрудника. Нет никаких изменений. Я понимаю, что это просто устанавливает формат по умолчанию, если Rails не может иначе понять это из заголовка или расширения содержимого.
Я начинаю думать, что не может быть способа сделать это на уровне маршрута.
Ruby <2.2? Не конвертируйте неизвестные входы в символы, или ваше приложение будет подвергаться атакам из аутсорсинга DoS (в этом случае требуется несколько форматов); вместо этого используйте 'request.format! = 'html'' – mdesantis
Полезно знать. Спасибо @mdesantis. Обновлен мой ответ. –