2011-11-29 56 views
0

我試圖在rails中創建一個啓用ajax的窗體。當我點擊提交按鈕時,窗體正常保存(我可以看到更新發生在數據庫中),但是,頁面剛好位於那裏(看起來好像什麼都沒有發生,沒有重定向等),並且在我的Web檢查,我看到以下錯誤:Rails的AJAX形式保存,重定向,更新問題

POST http://localhost:3000/user/mike 500 (Internal Server Error) 

然而,當我點擊上面的鏈接(HTTP://本地主機...)顯示在頁面包括:notice

我希望頁面像通常那樣重定向,並顯示:notice(如果可用)。我還希望能夠將表單保存在ajax上,而不會在某個時間間隔(每分鐘左右)重定向。這可能嗎?

user_controller.rb

def create 
    @user = User.new(params[:user]) 

    respond_to do |format| 
     if @user.save 
     format.html { redirect_to(@user, :notice => 'User saved.') } 
      format.js 

     else 

      format.html { render :action => "new" } 
      format.js 
     end 
    end 
    end 

    def update 
    @user = User.find_by_username(params[:id]) 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 

     format.html { redirect_to(@user, :notice => 'User updated.') } 
     format.js 

     else 

     format.html { render :action => "edit" } 
     format.js 

     end 
    end 
    end 

而且,這裏是我的表單標籤:

<%= form_for @user, :remote => true, :html => { :multipart => true, :class => 'edit_profile' } do |f| %> 

任何建議將是非常有益的...謝謝大家。

+0

我沒有時間收集鏈接,但應該定期查看ajax輪詢以保存表單。如果您希望頁面在提交時重定向,則應從表單中刪除remote => true。默認情況下,Rails會查找一個update.js視圖文件,以便在通過ajax發送表單時作出響應。如果你沒有它,它在客戶端不會做任何事情。 – Msencenb

回答

1

如果您希望create action爲ajax,您需要添加一個create.js模板(create.js.erb或create.js.haml),該模板將提供一些腳本以在頁。

(假設jQuery和ERB) - create.js.erb:

<% if @user.errors.any? %> 
    //update a div here with the errors collection 
<% else %> 
    $("#flash_notice").html("<%= escape_javascript(flash[:notice])%>"); 
<% end %> 

你可能需要一些額外的邏輯在裏面,如果出現錯誤,顯示錯誤的用戶列表。最簡單的情況是,如果表單已經在部分中,因爲您可以重新渲染顯示錯誤集合的部分。或者,您可以將錯誤集合寫入一個div。

至於在後臺定期更新,發佈表單的簡單javascript定時器可以正常工作。在控制器中,您可以不渲染任何東西(使用render nothing:true),或者提供一個update.js腳本來更改消息,如「上次保存在xxxx」。