2011-03-15 33 views
15

我正在創建一個簡單的演示應用程序,允許用戶輸入他們的電子郵件地址以註冊他們對接收測試版訪問的興趣。該應用程序然後向他們發送確認電子郵件,讓他們知道我們已收到他們的請求。如果你曾經註冊過測試版發佈的通知,那麼你就明白了。在Rails 3中使用Ajax進行錯誤處理

我很好奇如何在使用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之前,一切都很完美。如果表單通過驗證,那麼他們會看到成功的Flash消息,如果沒有,那麼他們會看到一個錯誤列表。所以,現在我有一個create.js.erb文件,我應該如何處理這些錯誤,而不必重複自己,或者這是不可能的。我顯然希望儘可能保持乾燥。

+0

這個答案對您有幫助嗎? – Techism 2011-03-15 21:32:27

回答

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 %> 

而且你的部分可能看起來像(假設的jQuery):

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

但也有另一種選擇......它甚至機。

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

如果您是通過在軌道3阿賈克斯工作的方式,本指南確實是最好理解的反應和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 
2

我不知道鐵軌遠程形式的方式來做到這一點,但我的操作標準模式是用此格式返回的Ajax請求的對象:

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

它工作得非常好,可以將部分渲染到數據字段以供在頁面上使用,或者可以循環錯誤對象中的錯誤以插入錯誤消息或突出顯示字段。

2

幾天前我一直面對同樣的問題。我在表單中使用remote => true選項在我的Rails 3應用程序中使用Ajax。之後,我一直在尋找驗證我的表單域的解決方案。在嘗試了很多jQuery/Javascript方法(儘管它們都不適用於我)後,我開始瞭解一款名爲client_side_validations的超級寶石。按照github鏈接(https://github.com/bcardarella/client_side_validations)上的說明安裝非常容易。它的功能就像表單字段的客戶端驗證一樣,確實是一個真棒寶石。希望這有助於那些厭倦了在Rails 3應用程序中使用Ajax後爲模型字段的客戶端驗證尋找簡單解決方案的用戶。

相關問題