如何通过 ajax 请求以模式显示任何自定义错误消息 Ruby on Rails

用户5084534

我想在引导模式中使用 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Ruby on Rails Ajax调用显示404错误

Ajax删除请求ReactJS和Ruby on Rails

Ruby on Rails AJAX提交表单错误

Ruby on Rails和Ajax

在Ruby on Rails中通过Ajax渲染部分视图

如何在 Rails 6.1 中使用 AJAX 请求执行带有属性的 ruby 函数?

当用户错误填写表单/遗漏某些东西时,如何通过Ruby on Rails上的JS显示错误消息?

如何在 ruby on rails 中使用 Ajax 正确运行分页

Ajax如何从Rails控制器上的ruby检索数据

如何显示API请求的自定义验证错误消息?

如何检测Ruby代码是否通过Ruby on Rails调用

如何通过带有 ruby on rails 的图像创建引导模式的链接

如何使用Ruby on Rails发出HTTP请求?

Ruby on Rails中的自定义搜索

Ruby on Rails中的日期自定义

如何显示个人列表?Ruby on Rails

如何从特定错误中解救(Ruby on Rails)

在Ruby on Rails应用程序中,页面不断通过AJAX调用进行重新加载

ruby on rails验证不显示错误消息

如何在Ruby on Rails中获得验证错误消息?

如何在更新Rails中的ruby之前验证错误消息

如何从Rails正确获取对React的AJAX请求

如何设置 Ruby on Rails?

如何自定义 jsonapi-serializer 缓存命名空间 - Ruby on Rails

如何在Ruby on Rails中添加自定义路线,控制器和动作?

如何在 Ruby on Rails 应用程序中实现自定义 css?

如何在Ruby on Rails 5中以起始值自动递增自定义ID?

我如何更改或自定义警报颜色bootstrap 4和Ruby on Rails 5

如何创建 ruby on rails 自定义多步表单而不是使用 gem