2014-10-03 2 views
1

У меня есть форма ввода Rails, по которой одно поле напрямую не связано с полем в базовом объекте: перед выполнением ввода его в поле ActiveRecord я должен выполнить некоторые вычисления. Пока все в порядке: я просто поместил расчет в контроллер.Проверка правильности рельсов по форме, а не записи

Моя проблема в том, что расчет может завершиться неудачно, и я хочу сообщить об этом пользователю. Я знаю, как сделать это с помощью флеш-оповещения, но это не связывает ошибку с конкретным полем ввода формы и не соответствует ошибкам, которые дает подтверждение проверки. То, что я хочу сделать, это указать форму, в которой поле ввода не удалось, и почему.

Вся документация, которую я могу найти, использует проверки ActiveRecord, но уже слишком поздно: я не могу создать ActiveRecord, потому что у меня нет данных, чтобы заполнить его (и даже если я заполню его недействительными фиктивными данными - yech! - Я потерял информацию о том, что вызвало ошибку, к тому времени, когда она попадает на проверку).

Так что же такое метод Rails для генерации ошибок проверки формы с контроллера (хорошо, хорошо, но я хочу, чтобы он работал, прежде чем я реорганизую его в проблему), а скорее из валидатора модели? Или что я должен делать вместо этого?

Редактировать: Вот пример такого мышления, который я пытаюсь сделать. Представьте себе менеджера флота, который занимается тысячами транспортных средств, обозначенных их регистрационными номерами (номерные знаки). Когда транспортное средство проверяется водителем, нет смысла предлагать раскрывающийся список с тысячами предметов, поэтому пользователь вводит регистрационный номер. Контроллер просматривает это (или, лучше, передает его модели, чтобы искать), он подбирается к записи транспортного средства, и идентификатор записи транспортного средства попадает в кассу. Если пользователь ошибочно подбирает номер, контроллер/модель (возможно) обнаруживает, что для этого автомобиля нет записи. Я знаю, что хочу сказать пользователю, почему сбой был неудачным, таким образом, который согласуется с другими ошибками проверки.

+3

Вы можете использовать виртуальный атрибут. Добавьте его в форму и поместите свою валидацию на нее – Mandeep

+0

@Mandeep имеет правильную идею. Эта логика не должна быть действительно в контроллере, а в самой модели. – engineersmnky

ответ

2

Моя проблема заключается в том, что расчет может завершиться неудачей, и я хочу сообщить об этом пользователю.

Виртуальные Атрибуты:

Виртуальные атрибуты представляют собой чистый способ, чтобы добавить поля формы, которые не отображаются непосредственно в базу данных и я думаю, что это очень хорошо работает с вашими потребностями. Для того, чтобы создать виртуальный атрибут в вы можете добавить эту строку в вашей модели:

class ModelName < ActiveRecord::Base 
    attr_accessor :your_field 
end 

После этого вы можете добавить это поле в форме и предварительное заполнение его после выполнения расчета с помощью JS. Затем вы можете добавить пользовательскую проверку в своей модели и проверить правильность расчета или нет.

class ModelName < ActiveRecord::Base 
    attr_accessor :your_field 

    validate :some_custom_validation_method 

    def some_custom_validation_method 
    # some logic 
    end 
end 

Для получения более подробной информации вы можете оформить этот railscast episode on virtual attributes

+0

Я задавался вопросом, как это сделать. Могу ли я выполнять вычисления в модели, а не в js, как в (старше) RailsCast? Во многом потому, что я знаю js даже меньше, чем я знаю Ruby/Rails, но также потому, что все, что мне нужно, легко доступно в модели. Мне нужно, чтобы все это было атомарным: расчет включает в себя поиск в других записях, поэтому, если я не сделаю его атомарным, существует риск того, что расчет, который я использовал для проверки формы, может быть ошибочным к моменту, когда я приходят обновить запись. Или я могу поднять ошибку проверки непосредственно из сеттера? – digitig

+0

@digitig Я попросил вас выполнить вычисления в js, потому что вам нужно заполнить его на основе выбора пользователей в форме и таким образом, если расследование не удастся. Пользователь также будет знать, что происходит в действительности, иначе вы думаете, что вы не показываете вычисленное поле пользователю и то внезапно пользователь начнет получать эту ошибку проверки, и он/она подумает о том, что только что произошло. – Mandeep

+0

Спасибо за помощь, но я до сих пор не знаю, где будет js. Я расширил вопрос, чтобы дать пример того, что я пытаюсь сделать. – digitig

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