Частичная валидация Rails в зависимости от контроллера - PullRequest
0 голосов
/ 21 января 2020

Я использую devise для регистрации пользователей, это означает, что по умолчанию новый пользователь регистрируется через registrations_controller. Поэтому, нажав кнопку «Зарегистрироваться», пользователь перенаправляется на new_user_registration path.

Моя форма регистрации, однако, состоит из двух шагов. На первом этапе (new_user_registration) я спрашиваю имя и пароль. На втором этапе (users_controller), когда пользователь сохраняется, я спрашиваю адрес. Это я делаю с мастером gem:

    def create
    @user = User.new(params[:user])
    if @user.save
      session[:user_id] = @user.id
      redirect_to user_steps_path
    else
      render :new
    end
  end

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

validates :first_name, presence: true, if: -> { new_user_registration_path }
validates :last_name, presence: true, if: -> { new_user_registration_path }
validates :street, presence: true, if: -> { new_user_path }

Я знаю, вот так, это не имеет смысла, но, возможно, это помогает понять мои мысли позади. Кроме того, возможно я могу работать с чем-то. например:

validates :first_name, presence: true, if: -> { @user.save }
validates :last_name, presence: true, if: -> { @user.save }
validates :street, presence: true, if: -> { @user.update}

Таким образом, при создании нового пользователя я бы проверил наличие имени и пароля. И когда я добавлю адрес (это обновление для пользователя), я проверю, присутствует ли адрес. У кого-нибудь есть опыт работы с такими формами?

Еще одна мысль, может быть, я могу пропустить регистрацию контроллера, перенаправив его непосредственно к пользователю и создав два шага для частичной проверки? Но так как я работаю с devise, я не знаю, смогу ли я просто go контролировать пользователей, пропуская путь new_user_registration. Я сделал это, как советовали по злому уроку, но все равно оказался в контроллере регистрации:

 def create
      super
  end
 def update
      super
  end

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 января 2020

Лучшее решение проблемы такого типа - использование объектов формы. См. этот пример и Gem Reform .

С объектами формы каждая HTML форма обрабатывается через объект формы. В вашем примере вы можете иметь форму «Регистрация пользователя» и форму «Обновление пользователя». Ключевым моментом является то, что проверка выполняется формой, а не моделью. Таким образом, проверка актуальна для текущей формы ввода, и вы избегаете проблем классификации правил проверки.

0 голосов
/ 21 января 2020

Это так просто:

validates :first_name, presence: true, :on => :create
validates :last_name, presence: true, :on => :create
validates :street, presence: true, :on => :update
validates :house_number, presence: true, :on => :update
validates :city, presence: true, :on => :update
validates :zip_code, presence: true, :on => :update

Ясно, что «Регистрация» создает пользователя. А wizard_steps просто обновляет пользователя. Таким образом, для этого простого примера это работает отлично и вызывает ошибки валидации в соответствии с действием контроллера.

...