Простая Форма Уведомления Об Ошибке


Я пытаюсь понять, как использовать простую форму с Rails, Devise, Omniauth и Bootstrap. У меня есть несколько проблем, но одна из них-уведомления об ошибках.

У меня есть форма devise sign in и sign up внутри Bootstrap modals. Регистрационная форма выглядит следующим образом. Обратите внимание, что я удалил функцию required: true из формы, потому что мне не нравится, когда звездочка добавляется к метке (но я попытался вернуть ее, чтобы посмотреть, будут ли работать уведомления об ошибках).

<% if user_signed_in? %>
  <li>
    <%= link_to('Edit registration', edit_user_registration_path) %>
  </li>
<% else %>
  <li>
    <%= link_to 'Register', new_user_registration_path, :remote => true, 'data-toggle' => "modal", 'data-target' => "#myRModal", :method => 'get' %>
  </li>

  <div class="modal fade" id="myRModal" tabindex="-1" role="dialog" aria-labelledby="myRModalLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
          <h4 class="modal-title" id="myModalLabel" style="color:black">Register</h4>
        </div>

        <div class="modal-body">
          <%- if devise_mapping.omniauthable? %>
            <div class="facebookauth"> <%= link_to "Register with Facebook", user_omniauth_authorize_path(:facebook) %></div>
            <br />
          <% end -%>
          <%- if devise_mapping.omniauthable? %>
            <div class="linkedinauth"> <%= link_to "Register with LinkedIn", user_omniauth_authorize_path(:linkedin) %></div>
            <br />
          <% end -%>
        </div>

        <div class="modal-footer">



  <%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
     <%= f.error_notification %>

     <div class="form-inputs" style="padding-left:20%; text-align:left; color:black;">

       <%= f.input :first_name, placeholder: 'Enter your first name', autofocus: true, :input_html => {:maxlength => 15, :size => 40} %>
       <%= f.input :last_name, placeholder: 'Enter your surname', autofocus: true, :input_html => {:maxlength => 15, :size => 40} %>
       <%= f.input :email, placeholder: 'Enter email',  autofocus: true, :input_html => {:maxlength => 25, :size => 40} %>
       <%= f.input :password, placeholder: 'At least 8 characters', :input_html => {:maxlength => 15, :size => 40} %>
       <%= f.input :password_confirmation, placeholder: 'Confirm your password',  :input_html => {:maxlength => 15, :size => 40} %>
     </div>

     <div class="form-actions" style="padding-left:20%; padding-top:5%; text-align:left; color:black;">
       <%= f.button :submit, "Register" %><% end %>

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

У меня есть пользователь / registration_controller со следующей функцией create:

def create
  @user = User.new(user_params)#(params[:user])

  respond_to do |format|
    if @user.save
      # Tell the UserMailer to send a welcome email after save
      # AdminMailer.new_user_waiting_for_approval.deliver

      format.html { redirect_to(root_path, notice: 'Registration received.') }
      format.json { render json: root_path, status: :created, location: @user }
    else
      format.html { redirect_to(root_path, alert: 'Sorry! There was a problem with your registration. Please contact us to sort it out.') }
       # format.html { render action: 'new' }
       format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end

У меня есть помощники devise как в моем помощнике приложения, так и в помощнике devise следующим образом:

def resource_name
  :user
end

def resource
  @resource ||= User.new
end

def devise_mapping
  @devise_mapping ||= Devise.mappings[:user]
end

Мой файл инициализаторов имеет два простых файла формы. Один из них-simple_form.rb. Другой-simple_form_bootstrap.rb

Ошибки не отображаются в виде строки. Когда я заполняю форму без электронной почты адрес, я получаю ошибку, которая появляется в функции create моего registration_controller.

Мне бы очень хотелось, чтобы ошибка отображалась в виде строки, когда пользователь нажимает кнопку Отправить.

Кто-нибудь знает, как решить эту проблему?

Спасибо.

4 3

4 ответа:

Убедитесь, что у вас есть аналогичная строка в оболочке инициализатора ur

b.use :error, wrap_with: { tag: 'span', class: 'help-block' }

Как вы упомянули в вопросе ur, пожалуйста, удалите required: false, и чтобы удалить ' * ' для требуемого, измените его в config / locale / simple_form.англ..yml

required:
  text: 'required'
  mark: ''

Кто-нибудь знает, как решить эту проблему?

Поскольку вы можете использовать объект в форме registration, это означает, что у вас есть некоторая свобода в том, как вы отображаете ошибки. Это была бы другая история, если бы вы пытались достичь того же с login (поскольку login не использует форму)

--

Форма

Мы уже делали это раньше (вы можете увидеть здесь - нажмите "Регистрация" вверху):

#app/views/devise/registrations/new.html.erb
<%= f.email_field :email, :placeholder => "email" %>
<div class="error"><%= devise_resource.errors[:email].first if devise_resource.errors[:email].present? %></div>

Рассматривая форму использует devise_resource в form_for object-это должно позволить вам отображать ошибки inline

Вы говорите, что используете модалы? Но вы не публикуете ajax (нет remote: true в вашей форме). Поэтому я опишу то, что, как мне кажется, происходит сейчас. Вы не публикуете ajax, поэтому вы публикуете html, поэтому он выбирает путь format.html, и при ошибке ваш контроллер перенаправляет на корневой путь с сообщением об ошибке. Вместо этого он должен повторно визуализировать форму.

Таким образом, раскомментированная строка в вашем действии create должна работать :) (и удаление текущей строки format.html очевидно).

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

Простая форма, когда задан объект с ошибками проверки, автоматически покажет ошибки inline.

Проблема с проверкой ошибок решается, если:

  1. удалить: f. error_nofication из вызова simple_form; и
  2. вставить: внутри поля ввода формы.

Если у вас есть валидации в вашей пользовательской модели, а также использовать devise validatable, список ошибок в верхней части формы будет дублировать ошибки. Удалите одну или другую из проверок, и у вас будут работать ошибки.

Я не могу понять, почему простая форма не делает ошибок-но это решение.

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

Что касается модального-я собираюсь попробовать использовать это. http://bootstrapvalidator.com (пальцы скрещенными). Надеюсь, этот ответ кому-то поможет. Я пытался настроить devise в течение 3 месяцев-с 3 недели твердых ежедневных усилий в попытке понять документы.