我正在创建一个简单的演示应用程序,允许用户输入他们的电子邮件地址,以注册他们的兴趣,以获得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