我正在创建一个简单的演示应用程序,允许用户输入他们的电子邮件地址,以注册他们的兴趣,以获得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 %>@H_301_7@
而这里是上述错误的部分.
<% if target.errors.any? %><ul>
<% target.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %></ul>
<% end %>@H_301_7@非常标准的东西控制器动作看起来像这样.
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@H_301_7@在实现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 %>@H_301_7@
而你的部分可能看起来像(假设jquery):
<% target.errors.full_messages.each do |error| %> var errors = $('<ul />'); errors.append('<li><%= escape_javascript( error ) %></li>'); <% end %>@H_301_7@但还有另外一个选择…甚至是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@H_301_7@