2016-04-22 51 views
0

在Rails應用程序中使用新的Turbolink 5 - 使用錯誤消息渲染窗體的最佳方式是什麼?該文件說:如何使用Turbolinks渲染窗體錯誤頁面5

而不是正常提交​​表單,提交他們與XHR。爲了響應服務器上的XHR提交,返回執行Turbolinks.visit的JavaScript,以便由瀏覽器進行評估。

因此,如果我的表單提交遠程請求更新,我應該只是做一個js形式替換或渦輪鏈接5有更好的方法?示例 -

控制器:

def update 
    @success = @team.update_attributes(team_params) 
end 

update.js

<% if @success %> 
    Turbolinks.visit('<%= teams_path %>', {action: 'replace'}); 
<% else %> 
    $('form').replaceWith('<%= j(render partial: '/teams/form') %>'); 
<% end %> 

是否有處理失敗的更新更turbolinks 5路?

回答

1

我還在修修補補。我唯一不同的做法是將條件邏輯放在控制器中而不是視圖中。

somethings_controller.rb

def create 
    if @something.save 
    redirect_to @something 
    else 
    render 'errors' 
    end 
end 

errors.js.erb

$('form').replaceWith('<%= j(render partial: 'form') %>'); 

爲什麼基於控制器的重定向的工作?由於in the docs for Turbolinks 5 it says ...

的Turbolinks Rails的引擎執行這種優化自動 非GET,與redirect_to的幫手重定向XHR請求。

......我認爲他們基本上將我們的重定向包裝在我們的Turbolinks.visit中。好的是,它會降低用戶沒有javascript的優雅,沒有我們必須與邏輯respond_to futz。

+0

好奇的部分是,如果我使用if @ something.save的正常思想; redirect_to @something;其他;渲染:新;當表單失敗時,它將返回帶有錯誤消息的new.html.erb響應,除非它不更新視圖來顯示它。這會更好,感覺就像我在這裏錯過了一些東西,並且必須渲染一個JS replaceWith似乎沒有必要。 – Dan

+0

我對你的陳述感到困惑:「當表格失敗時......」錯誤信息在屏幕上顯示或不顯示?你怎麼知道錯誤信息正在通過? –

+0

使用鉻網絡檢查員,我可以看到,當我提交表單將失敗它返回一個響應。響應中的HTML有錯誤消息HTML,但似乎返回的響應未在頁面上呈現。 – Dan

0

你可以看到爲什麼redirect_to作品被檢查出寶石:/gems/turbolinks-5.0.0.beta2/lib/turbolinks/redirection.rb

Turbolinks不處理表單提交,因此還需要明確處理提交和迴應(通過遠程:真或其他)。這裏有一些與其他解決方案有關的討論:https://github.com/turbolinks/turbolinks/issues/85