У меня есть приложение Rails, которое позволяет пользователю построить запрос к базе данных, заполнив обширную форму. Я задался вопросом о лучшей практике для проверки параметров формы в Rails. Раньше у меня был мой метод results
(тот, который подает форма):
if params[:name] && !params[:name].blank?
@name = params[:name]
else
flash[:error] = 'You must give a name'
redirect_to :action => 'index'
return
end
Но для нескольких полей формы, увидев, что это повторяется для каждого, стало утомительным. Я не мог просто придерживать их все в каком-то цикле, чтобы проверять каждое поле, потому что поля настроены по-разному:
- один ключ:
params[:name]
- ключ и под-ключ:
params[:image][:font_size]
- ожидать только заполнение полей формы, если установлено другое поле
Etc. Это также повторялось, потому что я устанавливал flash[:error]
для каждого отсутствующего/недопустимого параметра и перенаправлял один URL для каждого из них. Я переключился на использование before_filter
, который проверяет все необходимые параметры формы и возвращает только true, если все в порядке. Затем мой метод results
продолжается, а переменные просто назначаются равными, без проверки:
@name = params[:name]
В моем методе validate_form
у меня есть разделы кода, например:
if (
params[:analysis_type][:to_s] == 'development' ||
params[:results_to_generate].include?('graph')
)
{:graph_type => :to_s, :graph_width => :to_s,
:theme => :to_s}.each do |key, sub_key|
unless params[key] && params[key][sub_key]
flash[:error] = "Cannot leave '#{Inflector.humanize(key)}' blank"
redirect_to(url)
return false
end
end
end
Мне просто интересно, если я буду делать это наилучшим образом, или если мне не хватает чего-то очевидного, когда дело доходит до проверки параметров. Я беспокоюсь, что это все еще не самый эффективный метод, потому что у меня есть несколько блоков, где я назначаю значение flash[:error]
, затем перенаправляюсь к тому же URL-адресу, а затем возвращаю false.
Изменить, чтобы уточнить: причина, по которой у меня нет такой проверки в модели (-ях), в настоящее время по двум причинам:
- Я не пытаюсь собрать данные от пользователя, чтобы создать или обновить строку в базе данных. Ни одна из данных, отправленных пользователем, не сохраняется после их выхода из системы. Все это использовалось правильно, когда они отправили его для поиска в базе данных и создания некоторых вещей.
- Форма запроса принимает данные, относящиеся к нескольким моделям, и принимает другие данные, которые вообще не относятся к модели. Например. тип графика и тема, как показано выше, не подключаются к какой-либо модели, они просто передают информацию о том, как пользователь хочет отображать результаты.
Изменить, чтобы показать улучшенную технику: теперь я использую исключения для приложения, благодаря Jamis Buck Поднятие статьи о правильном исключении. Например:
def results
if params[:name] && !params[:name].blank?
@name = params[:name]
else
raise MyApp::MissingFieldError
end
if params[:age] && !params[:age].blank? && params[:age].numeric?
@age = params[:age].to_i
else
raise MyApp::MissingFieldError
end
rescue MyApp::MissingFieldError => err
flash[:error] = "Invalid form submission: #{err.clean_message}"
redirect_to :action => 'index'
end