ruby-on-rails – 在Rails 3中使用Ajax进行错误处理

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在Rails 3中使用Ajax进行错误处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个简单的演示应用程序,允许用户输入他们的电子邮件地址,以注册他们的兴趣,以获得beta访问.然后,应用程序向他们发送确认电子邮件,让他们知道我们已经收到他们的请求.如果您曾经注册通知测试版,那么您就可以获得这个想法.

我很好奇使用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文件,我应该如何处理错误而不重复自己,或者这是不可能的.我显然希望尽可能地保持干​​涸.

解决方法

您仍然可以为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呈现是非常有用的.

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

猜你在找的Ruby相关文章