1
我想在引導模式中使用ajax提交表單驗證用戶的請求。如何通過ajax請求以模式顯示任何自定義錯誤消息Ruby on Rails
我有一個表格:
<%= 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'
任何最佳實踐方法以及好嗎?
其保留在系統中輸入電子郵件,它不應該。它應該顯示錯誤,並應該回滾。不工作:) – LearningROR
它處理回滾和錯誤不會自動顯示,請確保在edit.html.erb中顯示錯誤。 –
它沒有。 :)我被迫做:'before_validation:search,on :: create'。至於錯誤,我已經設法在new.js.erb中顯示它們。另外,因爲我在rails 5中工作,所以使用turbolinks 5顯示來自ajax響應的錯誤已經改變了很多。 :)我會接受你的回答,因爲你給了我正確的方向。我有任何理由使用'before_validation:search,on :: create',你也可以共享。 – LearningROR