我想在引导模式中使用 ajax 提交表单来验证用户的请求。
我有一个表格:
<%= form_for [:admin, @site_admin], remote: true do |f| %>
<div id="error_explanation" style="display:none;"></div>
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="col-sm-3 control-label">Email</label>
<div class="col-sm-9">
<%= f.email_field :email, class: 'form-control', required: true %><br/>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<div class="text-left">
<button data-dismiss="modal" class="btn btn-primary btn-blue p-l-40 p-r-40">Cancel</button>
<%= button_tag @site_admin.new_record? ? 'Create Site Admin' : 'Update Site Admin', type: 'submit', class: 'btn btn-primary btn-base p-l-40 p-r-40' %>
</div>
</div>
<% end %>
模型:
class SiteAdmin < ApplicationRecord
self.table_name = 'users'
def self.search(params)
already_exists = where('email = ?', params[:email])
errors.add(:base, "email already exists ") if already_exists.size > 0
end
end
new.js.erb:
// Title for Add
$('#dialog h4').html("Add Site Admin");
// Render the edit form
$('.modal-body').html('<%= j render('form') %>');
// Show the dynamic dialog
$('#dialog').modal("show");
console.log('ddd')
$("form.new_site_admin").on("ajax:error", function (event, xhr) {
console.log('sswww')
var e, errors, i, len;
errors = jQuery.parseJSON(xhr.responseText);
$('#error_explanation').empty();
$('#error_explanation').append('<ul>');
for (i = 0, len = errors.length; i < len; i++) {
e = errors[i];
$('#error_explanation').append('<li>' + e + '</li>');
}
$('#error_explanation').append('</ul>');
return $('#error_explanation').show();
});
创建方法:
def create
respond_to do |format|
@already_exists = SiteAdmin.search(site_admin_params)
unless @already_exists.size > 0
@site_admin = SiteAdmin.new(site_admin_params)
if @site_admin.save
@site_admin.update_column(:confirmed_at, Time.now)
password = Digest::SHA1.hexdigest([Time.now, rand].join)[0..10]
user = User.where(email: @site_admin.email).first_or_initialize
user.attributes = {password: password, password_confirmation: password, role: 'admin'}
UserMailer.send_credentials(@site_admin.email, password).deliver_now if user.save!
format.json {head :no_content}
format.js {flash[:notice] = 'Site Admin has been created successfully.'}
else
format.json {render json: @site_admin.errors.full_messages,
status: :unprocessable_entity}
end
else
format.json {render json: @already_exists.errors.full_messages,
status: :unprocessable_entity}
end
end
end
问题是我无法在模型中显示错误消息。错误如:this email is already exists in the system.
我想创建一种通用的方法来处理这个问题,但无法正确显示它。
我看到的错误是:
Started POST "/admin/site_admins" for 127.0.0.1 at 2017-09-01 16:55:17 +0500
Processing by Admin::SiteAdminsController#create as JS
Parameters: {"utf8"=>"✓", "site_admin"=>{"email"=>"[email protected]"}, "button"=>""}
User Load (1.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]]
(0.9ms) SELECT COUNT(*) FROM "users" WHERE (email = '[email protected]')
Completed 500 Internal Server Error in 121ms (ActiveRecord: 11.4ms)
NameError (undefined local variable or method `errors' for #<Class:0x007f470c454110>):
app/models/site_admin.rb:6:in `search'
app/controllers/admin/site_admins_controller.rb:17:in `block in create'
app/controllers/admin/site_admins_controller.rb:16:in `create'
请问还有什么最佳实践方法吗?
这对你有用。该错误只与对象使用。我们可以在实例方法中而不是在类方法中使用它。
以下方法是在将记录保存到数据库之前实现模型级验证的标准方法。
class SiteAdmin < ApplicationRecord
self.table_name = 'users'
before_save :search
def search
already_exist = SiteAdmin.where('email = ?', self.email).limit(1)
errors.add(:base, "email already exists ") if already_exist
end
end
def create
respond_to do |format|
@site_admin = SiteAdmin.new(site_admin_params)
if @site_admin.save
@site_admin.update_column(:confirmed_at, Time.now)
password = Digest::SHA1.hexdigest([Time.now, rand].join)[0..10]
user = User.where(email: @site_admin.email).first_or_initialize
user.attributes = {password: password, password_confirmation: password, role: 'admin'}
UserMailer.send_credentials(@site_admin.email, password).deliver_now if user.save!
format.json {head :no_content}
format.js {flash[:notice] = 'Site Admin has been created successfully.'}
else
format.json {render json: @site_admin.errors.full_messages,
status: :unprocessable_entity}
end
end
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句