2013-09-05 5 views
0

Есть ли практика проверки параметров в контроллере?Проверка валидов в контроллере

@user = User.find_by_id(params[:id]) 

Если я вскрывайте парам, чтобы дать ему недопустимый :id параметров, скажем, посетив «/ пользователей/тест», я могу генерировать следующее сообщение об ошибке:

Conversion failed when converting the nvarchar value 'test' to data type int. 

Я имею в виду прямо сейчас параметров, которые не будут идти прямо к модели и могут быть подтверждены валидацией модели.

+2

Вот что модель валидация для. – usha

+1

Что вы пытались и чего вы ожидаете? Как вы «нарушили параметры»? Это слишком расплывчато. Кроме того, у Vimsha есть точка: почему вы не используете проверки модели? – Mischa

+0

@ Vimsha В этом случае валидация модели не будет работать. Я считаю, что спрашивающий говорит, если они переходят к «/ users/1/edit», это нормально, но если они переходят к «/ users/test/edit», это вызывает эту ошибку, потому что строка «test» не может быть преобразуется в целое число, чтобы выполнить 'User.find_by_id'. Это не имеет никакого отношения к проверке модели. – MrDanA

ответ

2

Да, вы всегда должны проверять свои параметры. Люди всегда могут возиться с параметрами в адресной строке своего веб-браузера или изменять параметры, хранящиеся в DOM. Другой пример, где параметры могут быть завинчены, - это если веб-страница остается открытой долгое время. Представьте, что кто-то просматривает страницу «/ users/3/edit» и оставляет ее открытой в течение часа, а затем обновляется. В то же время пользователь может быть удален. Вы не хотите, чтобы ваш сайт разбился - он должен обработать это изящно.

В зависимости от вашей базы данных и адаптера, User.find_by_id("test") не будет разбиваться. Но ваша база данных/адаптер не смог преобразовать строку в целое. В этом конкретном случае вы можете использовать метод Ruby's .to_i.

User.find_by_id(params[:id].to_i) 

Если params[:id] = "12", Ruby будет преобразовывать, что целое число 12 и код будет работать нормально. Если params[:id] = "test", Ruby будет преобразовывать, что целое число 0, и вы никогда не должны иметь запись в базе данных с идентификатором 0.

Вы также можете использовать regular expressions to test if a string is an integer.

Но в общем, да, попытайтесь всегда проверить свои параметры таким образом, вы можете обрабатывать ошибки грациозно и контролировать данные поступают.

+1

В этих случаях я думаю, что приложение должно генерировать 404, потому что вы пытаетесь перейти к URL-адресу, который не существует. Я думаю, что подход 'to_i' - хороший способ сделать это. Asker может захотеть изменить 'find_by_id' на' find_by_id! '. Это приведет к генерации исключения «ActiveRecord :: RecordNotFound», которое (в процессе производства) покажет страницу «404 Not Found». 'find_by_id' просто вернет' nil' вместо исключения, что может привести к другому неожиданному поведению. – Mischa

+0

Зависит от того, чего хочет программист. Мне нравится ловить как можно больше ошибок, перенаправить на соответствующую страницу и показать полезное сообщение об ошибке. – MrDanA

Смежные вопросы