【问题标题】:Error Handling with Ajax in Rails 3Rails 3 中的 Ajax 错误处理
【发布时间】:2011-07-15 10:49:06
【问题描述】:

我正在创建一个简单的演示应用程序,它允许用户输入他们的电子邮件地址来注册他们对接收测试访问的兴趣。然后,该应用程序会向他们发送一封确认电子邮件,让他们知道我们已收到他们的请求。如果您曾经注册以收到有关测试版发布的通知,那么您就会明白。

我很好奇在使用 AJAX 时如何处理 Rails 3 中的错误。在实现我的 respond_to 块之前,我有一个表单会呈现部分共享错误。

这是表格。

<% if flash[:notice] %>
<p><%= flash[:notice] %></p>
<% end %>

<p>Sign up to be notified when the beta launches.</p>

<%= form_for @user, :remote => true do |form| %>

    <%= render '/shared/errors', :target => @user %>

    <%= form.label :email, "Your Email Address" %>
    <%= form.text_field :email %>

    <%= form.submit "Notify Me" %>
<% end %>

这是前面提到的部分错误。

<% if target.errors.any? %>

<ul>
    <% target.errors.full_messages.each do |message| %>
        <li><%= message %></li>
    <% end %>
</ul>

<% end %>

非常标准的东西。控制器动作如下所示。

def create
@user = User.new(params[:user])

respond_to do |format|
  if @user.save
    format.html { redirect_to :back, flash[:notice] = "Thanks for your interest! We'll let you know when the app is in beta." }
    format.js
  else
    format.html { render :action => :new }
    format.js
  end
end
end

在实现 ajax 之前,一切都运行良好。如果表单通过验证,那么他们会看到成功闪烁消息,如果没有,他们会看到错误列表。所以现在我有一个 create.js.erb 文件,我应该如何处理错误而不重复自己,或者那是不可能的。我显然希望尽可能保持干燥。

【问题讨论】:

    标签: ruby-on-rails ajax


    【解决方案1】:

    您仍然可以为 js.erb 文件中的所有 .js 错误呈现共享部分。

    <% if @user.errors.any? %>
       var el = $('#create_user_form');
       // Create a list of errors
       <%= render :partial=>'js_errors', :locals=>{:target=> @user} %>
     <% else %>
         $('#users_list').append("<%= escape_javascript(render :partial=>"users/show", :locals=>{:user => @user }) %>");
        // Clear form
        el.find('input:text,textarea').val('');
        el.find('.validation-errors').empty();
    <% end %>
    

    你的部分可能看起来像(假设 jquery):

      <% target.errors.full_messages.each do |error| %>
        var errors = $('<ul />');
        errors.append('<li><%= escape_javascript( error ) %></li>');
      <% end %>
    

    但还有另一种选择……它甚至是 DRYer。

    http://www.alfajango.com/blog/rails-3-remote-links-and-forms/

    如果您正在使用 rails 3 中的 ajax,那么本指南确实是了解当前响应和 ajax 渲染的最佳选择。

    我完成了本指南并在 cmets 中发布了如何将 HTML 部分实际用于 HTML 和 AJAX 请求响应。我是偶然做的,然后跟进了如何做。

    享受吧!

    您实际上可以像以前一样直接返回带有响应的 html。

    这是简短的版本:

    def create
         @something = Somethng.new(params[:something])
         if @something.save
           respond_with( @something, :status => :created, :location => @something ) do |format|
             format.html do
               if request.xhr?
                 render :partial => "something/show", :locals => { :billable => @billable }, :layout => false
               end
             end
           end
           else
            respond_with( @something.errors, :status => :unprocessable_entity ) do |format|
              format.html do
                if request.xhr?
                  render :partial => "something/new", :locals => { :something => @something }, :layout => false
                else
                  render :action => :new
                end
              end
            end
          end
        end
    

    【讨论】:

      【解决方案2】:

      我不确定 Rails 远程表单的执行方式,但我的标准操作模式是在 ajax 请求中以这种格式返回对象:

      { success: true|false,
        data: "html or some other data",
        errors: {} } // jsonified ActiveModel::Errors object
      

      它工作得很好,让您可以将部分渲染到数据字段中以在页面上使用,或者您可以遍历错误对象中的错误以插入错误消息或突出显示字段。

      【讨论】:

        【解决方案3】:

        几天前我也遇到了同样的问题。我在表单中使用了remote =&gt; true 选项,以便在我的Rails 3 应用程序中使用Ajax。之后,我一直在寻找验证表单字段的解决方案。在尝试了大量的 jQuery / Javascript 方法(尽管它们都不适合我)之后,我开始了解一个名为 client_side_validations 的极好宝石。按照 github 链接 (https://github.com/bcardarella/client_side_validations) 上的说明进行安装非常容易。它对于表单字段的客户端验证就像魅力一样,确实是一个很棒的宝石。希望这对那些厌倦了在 Rails 3 应用程序中使用 Ajax 后寻找简单的模型字段客户端验证解决方案的人有所帮助。

        【讨论】:

          猜你喜欢
          • 2013-05-19
          • 2012-07-23
          • 2013-01-25
          • 1970-01-01
          • 1970-01-01
          • 2015-11-09
          • 2013-06-26
          • 1970-01-01
          • 2012-07-20
          相关资源
          最近更新 更多