Подтвердить что ты не робот

Проверка правильности рельсов

У меня есть приложение 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
4b9b3361

Ответ 1

Вы можете попробовать active_form ( http://github.com/cs/active_form/tree/master/lib/active_form.rb) - просто ActiveRecord минус материал базы данных. Таким образом, вы можете использовать все элементы проверки AR и обрабатывать свою форму, как и любую другую модель.

class MyForm < ActiveForm
  validates_presence_of :name
  validates_presence_of :graph_size, :if => # ...blah blah 
end

form = MyForm.new(params[:form])
form.validate
form.errors

Ответ 2

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

Ответ 3

Если бы вы снова решили проблему сегодня, вы могли бы создать модель для набора параметров запроса и использовать встроенные проверки Rails, Rails 3 упростит это с помощью ActiveModel:: Validations, см. этот пост.