0

В моем приложении Ruby on Rails я пытаюсь добавить проверки, которые гарантируют, что пользователь ввел значение в текстовое поле. В моей системе у меня есть таблица с именем Account, в которой хранится информация учетной записи электронной почты пользователей, когда они переходят на страницу views/accounts/_form.html.erb, чтобы добавить новую учетную запись электронной почты. Я хочу проверить наличие номера порта. Я могу сделать это с помощью следующего кода:Ruby on Rails: как проверить, есть ли на определенной странице?

validates :port, presence: true 

Это успешно обеспечивает пользователям ввести свой номер порта, но когда пользователь подписывает через views/users/_new.html.erb страницу они должны ввести только адрес электронной почты (например, пример @ пример. com), и users_controller затем создаст запись в таблице Account для этого адреса электронной почты. Моя проблема в том, что на странице views/accounts/_form.html.erb номер порта требуется, но на views/users/_new.html.erb это не так.

Есть ли способ подтверждения того, что пользователь вводит номер порта, если он находится на странице views/accounts/_form.html.erb или вызывает метод create в accounts_controller?

Я знаю, что я мог бы сделать это с помощью необходимой HTML-проверки: <%= f.text_field :port, :required => true %>, но мне нужно добавить дополнительную проверку, а также наличие, поэтому это не подходит.

ответ

3

Вы можете создать attr_accessor поле, которое определяет, если проверка должна произойти ...

class Account < ActiveRecord:Base 
    attr_accessor :port_needs_validation 
    validates :port, presence: true, if: -> {port_needs_validation} 

Тогда просто установить аксессор в методе создания ...

def create 
    @account = Account.new 
    @account.assign_attributes(account_params) 
    @account.port_needs_validation = true 
    if @account.save 
    ... 
1

Extract, что часть логику в объект формы, проверьте legendary 2012 blog entry from CodeClimate. Многое изменилось с тех пор, автор использует Virtus строить объекты формы, более популярные & уточненный камни в эти дни:

если это разовая вещь, просто сделайте what Steve said in the other answer, но это верный путь в ад, сейф e-ненависть и развод (по крайней мере, из личного опыта) в любом слегка подросток weeny большой проект (т. вы хотите потратить несколько часов на то, чтобы работать над этим, это не то, что вы только что закончили все и хотите вернуться домой).

На самом деле, просто используйте классы классов во всем мире и избегайте проверки модели & других обратных вызовов вообще. Вы не хотите, чтобы при отправке тестов отправляли учетные записи активации аккаунта или проверяли сложность пароля, и вам просто нужно «сообщение», которое принадлежит «пользователю».

Мой собственный любимые личные разорвать ламерско из-за модели обратных вызовов происходит отправку 240.000 «ваш аккаунт был обновлен/понижено» сообщений электронной почты из-за обновление невинного изменения правописания в миграции на account_type атрибуте только потому, что account_type_changed? было правдой.

Итак, классы форм навсегда, обратные вызовы модели никогда.

0

Я бы не рекомендовал вам model знает о views. В решении @SteveTurczyn абстрактное поле вводится в модель, чтобы определить, с какой страницы она исходит, что является хорошим решением.

Как из Ruby on Rail MVC, как View и Model разговор с контроллером, другое решение будет иметь контроллер ручки проверки из Params перед передачей значения для создания account.

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