簡體   English   中英

在Rails中使用Ajax進行錯誤處理3

[英]Error Handling with Ajax in Rails 3

我正在創建一個簡單的演示應用程序,允許用戶輸入他們的電子郵件地址以注冊他們對接收測試版訪問權的興趣。 該應用程序然后向他們發送一封確認電子郵件,讓他們知道我們已收到他們的請求。 如果您已經注冊以獲得測試版發布的通知,那么您就會明白這一點。

我很好奇如何在使用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文件,我應該如何處理錯誤而不重復自己,或者這是不可能的。 我顯然希望盡可能保持干燥。

您仍然可以在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

我幾天前一直面臨同樣的問題。 我在我的表單中使用了remote => true選項在我的Rails 3應用程序中使用Ajax。 之后,我一直在尋找驗證表單字段的解決方案。 在嘗試了大量的jQuery / Javascript方法之后(雖然它們都沒有為我工作)但我開始了解一個名為client_side_validations的精湛寶石。 按照github鏈接( https://github.com/bcardarella/client_side_validations )上的說明安裝非常簡單。 它的工作方式就像表單字段的客戶端驗證一樣,確實是一個很棒的寶石。 希望這對那些厭倦了在Rails 3應用程序中使用Ajax后尋找模型字段的客戶端驗證的簡單解決方案的人有所幫助。

我不確定rails遠程方式這樣做,但我的標准操作模式是以這種格式返回ajax請求上的對象:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM