2017-09-01 50 views
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' 

任何最佳實踐方法以及好嗎?

回答

2

這將爲你工作。 錯誤僅用於對象。我們可以按原樣使用實例方法不在方法。

以下方法是在將記錄保存到數據庫之前實現模型級別驗證的標準方法。

型號:

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 
+0

其保留在系統中輸入電子郵件,它不應該。它應該顯示錯誤,並應該回滾。不工作:) – LearningROR

+0

它處理回滾和錯誤不會自動顯示,請確保在edit.html.erb中顯示錯誤。 –

+1

它沒有。 :)我被迫做:'before_validation:search,on :: create'。至於錯誤,我已經設法在new.js.erb中顯示它們。另外,因爲我在rails 5中工作,所以使用turbolinks 5顯示來自ajax響應的錯誤已經改變了很多。 :)我會接受你的回答,因爲你給了我正確的方向。我有任何理由使用'before_validation:search,on :: create',你也可以共享。 – LearningROR

相關問題