在Rails中使用Ajax进行error handling3

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

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

这是表格。

 

Sign up to be notified when the beta launches.

true do |form| %> @user %>

这里是上述错误的部分原因。

  

很标准的东西。 控制器动作看起来像这样。

 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之前,一切都运行良好。 如果表单通过validation,则他们会看到成功的flash消息,如果没有,则会看到错误列表。 所以现在我有一个create.js.erb文件,我应该如何处理错误而不重复自己,或者这是不可能的。 我显然希望尽可能保持干燥。

您仍然可以为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 = $('
    '); errors.append('
  • <%= escape_javascript( error ) %>
  • '); <% end %>

    但也有另一个选择……它甚至是DRYer。

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

    如果你正在通过rails 3中的ajax工作,那么本指南对于理解当前的响应和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 

    我不确定rails远程方式这样做,但我的标准操作模式是以这种格式返回ajax请求上的对象:

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

    它工作得很好,并允许您将部分数据呈现到数据字段以供在页面上使用,或者您可以循环错误对象中的错误以插入错误消息或突出显示字段。

    我几天前一直面临同样的问题。 我在我的表单中使用了remote => true选项在我的Rails 3应用程序中使用Ajax。 之后,我一直在寻找validation表单字段的解决方案。 尝试了大量的jQuery / Javascript方法(虽然它们都没有为我工作)但我开始了解一个名为client_side_validations的精湛gem。 按照github链接( https://github.com/bcardarella/client_side_validations )上的说明安装非常简单。 它就像表单字段的客户端validation的魅力一样,确实是一个很棒的gem。 希望这对那些厌倦了在Rails 3应用程序中使用Ajax后寻找模型字段的客户端validation的简单解决方案的人有所帮助。