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

kyl*_*yle 15 ajax ruby-on-rails

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

我很好奇如何在使用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 %>
Run Code Online (Sandbox Code Playgroud)

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

<% if target.errors.any? %>

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

<% end %>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

Tec*_*ism 16

您仍然可以在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 %>
Run Code Online (Sandbox Code Playgroud)

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

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

但也有另一个选择......它甚至是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
Run Code Online (Sandbox Code Playgroud)