В ruby ​​on rails какой код будет спрашивать, прошла ли форма всю проверку или нет? - PullRequest
0 голосов
/ 27 октября 2011

Я хочу, чтобы моя форма пересылалась в recaptcha, но только после того, как форма прошла все проверки.Как бы я достиг этого, прежде чем данные пользователей будут сохранены в БД?

def create
      @user = User.new(params[:user])     
      respond_to do |format|
      if @user.save

        #to recaptcha, but before save and only after sign up form passes validation
      else

      format.html { render :new }  
      format.js   { render :form_errors }
      end
    end
  end

Ответы [ 3 ]

1 голос
/ 27 октября 2011

В этом Railscast есть все, что вам нужно знать о многошаговых формах. Эпизод охватывает проверку и переход от одного шага к другому. http://railscasts.com/episodes/217-multistep-forms

Похоже, что ваша форма состоит из двух этапов: первый - это то, где они вводят всю свою информацию, а второй - просто ввод капчи.

Теперь, по моему мнению, вы должны просто свернуть капчу в основную форму ввода пользователя и сохранить все это на одной странице вместо двухэтапного процесса, который я делал раньше, и чтобы капча была частью та же форма намного, намного проще и менее сложна. Наличие всего в одной форме позволяет вам объединить всю свою логику (в основном) в одно действие контроллера. Может существовать логика, которую вы можете абстрагировать из контроллера во вспомогательный метод, например, проверка капчи, которая сделает действие вашего контроллера намного менее сложным. Последнее, что вы хотите сделать, это чрезмерно усложнить логику действий.

1 голос
/ 27 октября 2011

Внимательно посмотрите на Полное руководство по аутентификации веб-сайтов на основе форм и спросите себя, действительно ли вам нужна капча.

Кроме того, вы можете использовать Обратные вызовы : after_validation, before_save, around_save, after_save, before_create, around_create, after_create, before_update, around_update, after_update для обработки содержимого, все еще находящегося в вашей транзакции.

Чтобы вызвать один из этих обратных вызовов, просто объявите их в своем model

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

Вы не должны делать это в контроллере после получения сообщения формы, так как вам придется:

  1. Сохранять заполненные значения формы в сеансе после проверки (не сохранять)
  2. Перенаправить пользователя на страницу с изображением капчи (что приведет любого пользователя в замешательство)
  3. Несколько раз проверить код проверки перед его прохождением (они совершенно не читаются)
  4. Получитьмодель вне сеанса (которую вы даже не представляете, какая именно)
  5. Вызовите save для модели, чтобы фактически записать ее в вашу БД.

Таким образом, в основном вы избегаете запускатранзакция до того, как капча будет пройдена.

1 голос
/ 27 октября 2011

В модели живет валидация, вы можете просто сделать это в контроллере:

@user.valid?

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

Другое решение заключается в использовании обратных вызовов, таких как: before_save или before_create, но только в том случае, если к модели можно получить доступ к recaptcha (в чем я сомневаюсь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...