2016-01-13 60 views
3

我在Rails 4中使用remote:true創建了一個ajax表單。由於某種原因,我錯過了,我的驗證錯誤沒有顯示在窗體中。Rails遠程表單驗證錯誤未顯示

這裏是我當前的代碼庫:

1.表

= simple_form_for @foo, url: foos_path, as: :foo, remote: true do |f| 

    .row 
    .input-field 
     = f.input :bar 

    .right-align.card-button 
    = f.button :submit, class: "waves-light blue", data: { disable_with: "Loading..." } 

2. create.js.erb

$("#new_foo").html('<%= j render_cell :foo, :form, foo: @foo %>'); 

3.控制器

def create 
    @foo = FooForm.new(Foo.new) 
    respond_to do |format| 
    if @foo.validate(params[ :country ]) 
     @foo.save 
     format.html { redirect_to root_path } 
     format.json { render :show, status: :created, location: @foo.model } 
     format.js 
    else 
     format.html { render :new } 
     format.json { render json: @foo.errors, status: :unprocessable_entity } 
     format.js 
    end 
    end 
end 

我希望這個代碼後顯示驗證錯誤的提交不正確。然而由於某種原因,不正確的提交後沒有任何反應我可以確認表單正在提交,但是由於提交的內容是在日誌中處理的,我也可以確認當我刪除遠程提交時,表單工作得很好。

有什麼我失蹤?

PS。我使用的是Reform gem,這可能會讓我的控制器目標代碼對很多人來說似乎有點不熟悉。我在我的js文件使細胞按本gem

UPDATE 我有這個掙扎更多一些。我實現了一個解決方案,我已經複製了一個「遠程:真實」的解決方案,我已經在之前的應用程序中逐步構建了這個解決方案。這在我以前的應用程序中完美運行,但不會在我的新應用程序中顯示驗證錯誤。這兩個應用程序唯一的區別是Ruby和Rails的版本。

在第一個應用程序,我跑的Ruby 2.2.1和Rails:4.2.2。我的新應用程序('我無法工作')我運行Ruby:2.2.3與Rails:4.2.4。

莫非這或許有一定影響?

+0

我從你的答案中瞭解到了'render_cell',謝謝 –

+0

你能通過瀏覽器發佈確切的HTML響應嗎?有趣的是它是如何工作,而不是'遠程' –

+0

@RichPeck感謝您的回覆。很高興我能幫上忙。這是一個偉大的小寶石,它幫助我清理了我的代碼。我不清楚你到底在問什麼?我已經更新了一些更詳細的問題。 – Herm

回答

4

多小時後我終於設法解決這個問題。仍然不知道爲什麼會發生這種情況,但我在這裏提供了答案,以防其他人經歷類似的情況。 This Stackoverflow答案讓我朝着正確的方向前進。

我需要將此行添加到我的創建行動:

format.js { render layout: false, content_type: 'text/javascript' } 

因此我充滿創造的行動,現在看起來是這樣的:

def create 
    @foo = FooForm.new(Foo.new) 
    respond_to do |format| 
    if @foo.validate(params[ :country ]) 
     @foo.save 
     format.html { redirect_to root_path } 
     format.json { render :show, status: :created, location: @foo.model } 
     format.js 
    else 
     format.html { render :new } 
     format.json { render json: @foo.errors, status: :unprocessable_entity } 
     format.js { render layout: false, content_type: 'text/javascript' } 
    end 
    end 
end 
+0

同樣的問題,因爲你兄弟。我加了remote = true,驗證沒有顯示 - 我想這是因爲表單沒有被提交。你有什麼想法如何解決這個問題? – BKSpurgeon

1

從兮兮的代碼,我看到的唯一的事情,似乎甚至略有不爽 - 是渲染調用。糾正我,如果我錯了,但目前你不會將錯誤作爲模型對象返回,而我認爲你需要提供errors鍵。

format.json { render json: {errors: @foo.errors}, status: :unprocessable_entity }

或者,另外我相信,如果你是剛剛返回對象本身的錯誤都會被正確映射到該對象內的errors關鍵。

format.json { render json: @foo, status: :unprocessable_entity }

+0

感謝您的這種嘗試@codeurge。不幸的是仍然沒有運氣我可以在我的JS控制檯中看到正確的響應,但錯誤不會顯示在我的表單中。 – Herm

+0

我更新了一些更詳細的問題。我嘗試了很多方法,但仍然沒有運氣。 – Herm

+0

鑑於您能夠在JSON響應中看到JS控制檯中的錯誤並且您在HTML響應中看到錯誤('remote:true'已移除)的附加信息 - 您可能需要第二個意見,但我無法找到simple_form支持渲染通過AJAX返回的錯誤。您可能必須將simple_form作爲JSON中的一部分返回,並將該響應重新呈現給DOM,或者編寫一些代碼來僅顯示返回的錯誤。我懷疑這是因爲你在兩種情況下都有錯誤,唯一的區別就是重新渲染。 – codeurge

1

爲什麼它不工作的原因是因爲AJAX默認預期將可解析的javascript作爲響應,而不是json對象本身。你需要調整$.ajaxSetupdataType: json,或者將'json'作爲最終參數傳遞給$ .post(在回調之後),所以它默認預期json。