在Rails 3中使用Ajax进行错误处理

问题描述:

我正在创建一个简单的演示应用程序,允许用户输入他们的电子邮件地址以注册他们对接收测试版访问的兴趣。该应用程序然后向他们发送确认电子邮件,让他们知道我们已收到他们的请求。如果你曾经注册过测试版发布的通知,那么你就明白了。在Rails 3中使用Ajax进行错误处理

我很好奇如何在使用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之前,一切都很完美。如果表单通过验证,那么他们会看到成功的Flash消息,如果没有,那么他们会看到一个错误列表。所以,现在我有一个create.js.erb文件,我应该如何处理这些错误,而不必重复自己,或者这是不可能的。我显然希望尽可能保持干燥。

+0

这个答案对您有帮助吗? – Techism 2011-03-15 21:32:27

您仍然可以在您的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 %> 

但也有另一种选择......它甚至机。

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

如果您是通过在轨道3阿贾克斯工作的方式,本指南确实是最好理解的反应和Ajax渲染,因为它目前为。

我通过本指南工作,并发布在评论中,您如何实际使用您的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 

我不知道铁轨远程形式的方式来做到这一点,但我的操作标准模式是用此格式返回的Ajax请求的对象:

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

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

几天前我一直面对同样的问题。我在表单中使用remote => true选项在我的Rails 3应用程序中使用Ajax。之后,我一直在寻找验证我的表单域的解决方案。在尝试了很多jQuery/Javascript方法(尽管它们都不适用于我)后,我开始了解一款名为client_side_validations的超级宝石。按照github链接(https://github.com/bcardarella/client_side_validations)上的说明安装非常容易。它的功能就像表单字段的客户端验证一样,确实是一个真棒宝石。希望这有助于那些厌倦了在Rails 3应用程序中使用Ajax后为模型字段的客户端验证寻找简单解决方案的用户。