设计合并 Bootstrap 后不显示的错误消息
Devise error messages not displaying after incorporating Bootstrap
我意识到这个问题或类似的问题以前曾被问过,但我发现 none 的建议解决方案对我有用。
所以我正在使用 Devise 身份验证 gem 构建一个网站,并且最近尝试将 Bootstrap 用于样式。我让它工作了,但是设计错误消息不再显示在注册页面上(即告诉用户某些字段不能为空的消息等)。
(我不确定是 Bootstrap 的并入破坏了事情,但它确实发生在那个提交的某个地方。)
另外值得注意的是,当注册失败时用户被重定向到的 URL 页面从“https://my-site-wanderspeak.c9users.io/users”更改为这个怪物:
“https://my-site-wanderspeak.c9users.io/users/sign_up?utf8=%E2%9C%93&authenticity_token=QI2XnYtJnm2VdWbff%2B1HGCHQ21r1aQR7li%2FemTWJni3sP0vl7f%2FIyRDdXVf1iAdRsGpK63skwc6UqUEXFvK2Gg%3D%3D&user%5Bfirstname%5D=&user%5Blastname%5D=&user%5Bdob%282i%29%5D=11&user%5Bdob%283i%29%5D=5&user%5Bdob%281i%29%5D=2017&user%5Bphone%5D=&user%5Bemail%5D=&user%5Bpassword%5D=&user%5Bpassword_confirmation%5D=”。两者都是相同的注册页面,但第一个包含错误消息。
我的看法:
<head>
<!-- Include Bootstrap and HTML Kickstart (for style) -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
<link rel="stylesheet" href="/assets/kickstart.css" media="all" /> <!-- KICKSTART -->
<%= stylesheet_link_tag "users" %>
</head>
<body>
<form>
<div class="container" style="background-color:white">
<div class="row" style="text-align:center">
<div class="col-md-12" style="margin-bottom:5px">
<h2>Sign up</h2>
</div>
</div>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div class="row">
<div class="col-md-6 left-col form-group">
<div class="field padded">
<label>First name:</label>
<%= f.text_field :firstname, size: "20" %>
</div>
<div class="field padded">
<label>Last name:</label>
<%= f.text_field :lastname, size: "20" %>
</div>
<div class="field padded">
<label>Date of birth:</label>
<%= date_select :user, :dob, :start_year => 1900, :end_year => 2017, :use_month_numbers => true, :order => [:month, :day, :year] %>
</div>
<div class="field">
<label>Phone:</label>
<%= f.text_field :phone, :id => "phone", placeholder: "(___) ___-____", size: "16" %>
</div>
<div class="field padded">
<label>Email:</label>
<%= f.email_field :email, placeholder: "(this will be your username)", size: "32" %>
</div>
<div class="field padded">
<label>Password:</label>
<%= f.password_field :password, autocomplete: "off", placeholder: "(6 characters minimum)", size: "24" %>
</div>
<div class="field padded">
<label>Confirm password:</label>
<%= f.password_field :password_confirmation, autocomplete: "off", size: "24" %>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12" style="text-align:center">
<div class="actions" style="margin-bottom:20px; margin-top:-10px">
<button class="large purple">Sign Up</button>
</div>
<% end %>
</div>
</div>
</div>
</form>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
(结尾的 </body>
标签由于某种原因没有显示。)
我的application.html.erb:
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
<title>Welcome to the Community Board!</title>
<%= stylesheet_link_tag 'application', 'media' => 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>
<body>
<h1 class="title">Welcome to the Community Board!</h1>
<div id="main">
<% if flash[:notice] %>
<div class="message" id="notice">
<%= flash[:notice] %>
</div>
<% elsif flash[:warning] %>
<div class="message" id="warning">
<%= flash[:warning] %>
</div>
<% end %>
<%= yield %>
</div>
</body>
</html>
我的(已编辑)devise_helper.rb:
module DeviseHelper
# A simple way to show error messages for the current devise resource. If you need
# to customize this method, you can either overwrite it in your application helpers or
# copy the views to your application.
#
# This method is intended to stay simple and it is unlikely that we are going to change
# it to add more behavior or options.
def devise_error_messages!
return "" if resource.errors.empty?
messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
html = <<-HTML
<div class="alert alert-danger">
<button type="button" class="close" data-dismiss="alert">x</button>
<strong>#{messages}</strong>
</div>
HTML
html.html_safe
end
end
如果我还应该包含任何其他信息,请告诉我。
答案:从视图中删除 <form>
标签。
不知道为什么。
我意识到这个问题或类似的问题以前曾被问过,但我发现 none 的建议解决方案对我有用。
所以我正在使用 Devise 身份验证 gem 构建一个网站,并且最近尝试将 Bootstrap 用于样式。我让它工作了,但是设计错误消息不再显示在注册页面上(即告诉用户某些字段不能为空的消息等)。
(我不确定是 Bootstrap 的并入破坏了事情,但它确实发生在那个提交的某个地方。)
另外值得注意的是,当注册失败时用户被重定向到的 URL 页面从“https://my-site-wanderspeak.c9users.io/users”更改为这个怪物: “https://my-site-wanderspeak.c9users.io/users/sign_up?utf8=%E2%9C%93&authenticity_token=QI2XnYtJnm2VdWbff%2B1HGCHQ21r1aQR7li%2FemTWJni3sP0vl7f%2FIyRDdXVf1iAdRsGpK63skwc6UqUEXFvK2Gg%3D%3D&user%5Bfirstname%5D=&user%5Blastname%5D=&user%5Bdob%282i%29%5D=11&user%5Bdob%283i%29%5D=5&user%5Bdob%281i%29%5D=2017&user%5Bphone%5D=&user%5Bemail%5D=&user%5Bpassword%5D=&user%5Bpassword_confirmation%5D=”。两者都是相同的注册页面,但第一个包含错误消息。
我的看法:
<head>
<!-- Include Bootstrap and HTML Kickstart (for style) -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
<link rel="stylesheet" href="/assets/kickstart.css" media="all" /> <!-- KICKSTART -->
<%= stylesheet_link_tag "users" %>
</head>
<body>
<form>
<div class="container" style="background-color:white">
<div class="row" style="text-align:center">
<div class="col-md-12" style="margin-bottom:5px">
<h2>Sign up</h2>
</div>
</div>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div class="row">
<div class="col-md-6 left-col form-group">
<div class="field padded">
<label>First name:</label>
<%= f.text_field :firstname, size: "20" %>
</div>
<div class="field padded">
<label>Last name:</label>
<%= f.text_field :lastname, size: "20" %>
</div>
<div class="field padded">
<label>Date of birth:</label>
<%= date_select :user, :dob, :start_year => 1900, :end_year => 2017, :use_month_numbers => true, :order => [:month, :day, :year] %>
</div>
<div class="field">
<label>Phone:</label>
<%= f.text_field :phone, :id => "phone", placeholder: "(___) ___-____", size: "16" %>
</div>
<div class="field padded">
<label>Email:</label>
<%= f.email_field :email, placeholder: "(this will be your username)", size: "32" %>
</div>
<div class="field padded">
<label>Password:</label>
<%= f.password_field :password, autocomplete: "off", placeholder: "(6 characters minimum)", size: "24" %>
</div>
<div class="field padded">
<label>Confirm password:</label>
<%= f.password_field :password_confirmation, autocomplete: "off", size: "24" %>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12" style="text-align:center">
<div class="actions" style="margin-bottom:20px; margin-top:-10px">
<button class="large purple">Sign Up</button>
</div>
<% end %>
</div>
</div>
</div>
</form>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
(结尾的 </body>
标签由于某种原因没有显示。)
我的application.html.erb:
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
<title>Welcome to the Community Board!</title>
<%= stylesheet_link_tag 'application', 'media' => 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>
<body>
<h1 class="title">Welcome to the Community Board!</h1>
<div id="main">
<% if flash[:notice] %>
<div class="message" id="notice">
<%= flash[:notice] %>
</div>
<% elsif flash[:warning] %>
<div class="message" id="warning">
<%= flash[:warning] %>
</div>
<% end %>
<%= yield %>
</div>
</body>
</html>
我的(已编辑)devise_helper.rb:
module DeviseHelper
# A simple way to show error messages for the current devise resource. If you need
# to customize this method, you can either overwrite it in your application helpers or
# copy the views to your application.
#
# This method is intended to stay simple and it is unlikely that we are going to change
# it to add more behavior or options.
def devise_error_messages!
return "" if resource.errors.empty?
messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
html = <<-HTML
<div class="alert alert-danger">
<button type="button" class="close" data-dismiss="alert">x</button>
<strong>#{messages}</strong>
</div>
HTML
html.html_safe
end
end
如果我还应该包含任何其他信息,请告诉我。
答案:从视图中删除 <form>
标签。
不知道为什么。