Простая Форма Уведомления Об Ошибке
Я пытаюсь понять, как использовать простую форму с 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">×</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 ответа:
Убедитесь, что у вас есть аналогичная строка в оболочке инициализатора ur
b.use :error, wrap_with: { tag: 'span', class: 'help-block' }
Как вы упомянули в вопросе ur, пожалуйста, удалите
required: false
, и чтобы удалить ' * ' для требуемого, измените его в config / locale / simple_form.англ..ymlrequired: 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.
Проблема с проверкой ошибок решается, если:
- удалить: f. error_nofication из вызова simple_form; и
- вставить: внутри поля ввода формы.
Если у вас есть валидации в вашей пользовательской модели, а также использовать devise validatable, список ошибок в верхней части формы будет дублировать ошибки. Удалите одну или другую из проверок, и у вас будут работать ошибки.
Я не могу понять, почему простая форма не делает ошибок-но это решение.
Я решил удалить простую форму из моего приложения - я не могу читать документацию, и поэтому многие вопросы, опубликованные на Stack Overflow, касающиеся использования его с devise, не получают ответа. Я не вижу в этом никакой пользы.
Что касается модального-я собираюсь попробовать использовать это. http://bootstrapvalidator.com (пальцы скрещенными). Надеюсь, этот ответ кому-то поможет. Я пытался настроить devise в течение 3 месяцев-с 3 недели твердых ежедневных усилий в попытке понять документы.