2017-02-03 137 views
1

在我的Rails 5/5 Turbolinks應用程序,我想提出從一個表單提交到一個div產生的HTML。Turbolinks 5 AJAX POST

的形式是

= form_for(user) do |f| 

標準導軌形式。

成功提交後重定向被髮送到瀏覽器

respond_to do |format| 
     if @user.save 
     format.html { redirect_to @user, notice: 'User was created.' } 

當我通過AJAX提交表單:

$(".dialog").on("submit", "form", function(e){ 
e.preventDefault(); 
$.ajax({ 
    url: $(this).attr("action"), 
    method: "POST", 
    data: $(this).serialize() 
}).done(function(data) { 
    $(".dialog .canvas").html(data); 
}); 
}); 

的距離被提交和服務器的redirect_to的聲明重定向瀏覽器新用戶的頁面。

重定向使turbolinks與瀏覽器被重定向到頁面的內容替換身體。而是我想要替換特定的div $(「。dialog .canvas」)。html(data)。我怎樣才能防止turbolinks的這種行爲。

+0

您可以將您的控制器代碼?我的猜測是,你不應該重定向,而是提出對請求的響應。 –

+0

觀看此視頻,它會幫助你。 http://railscasts.com/episodes/205-unobtrusive-javascript – WaKeMaTTa

回答

0

如果我明白你正確地做什麼,你可以使從服務器HTML和使用從服務器上生成的JavaScript更新div元素。

# HTML form 
<%= form_for @user, remote: true do |f| %> 
    ... 
<% end %> 

# app/controllers/users_controller.rb 
def create 
    @user = User.create(user_params) 
    # renders create.js.erb automatically with AJAX request (remote: true) 
end 

# app/views/users/create.js.erb 
$("#my-div").html("<%=j render(partial: 'users/user', locals: { user: @user }) %>"); 

請注意,在您的js.erb文件中,您可以使用Ruby以及JavaScript;我發現它非常適用於構建HTML和動態內容並將其傳回客戶端以作爲JavaScript運行。

人們可以討論服務器生成的JavaScript的優點/缺點,但我是完全沒有意見的,而且運作良好。否則,你必須保持服務器/客戶端模板同步,這真的很麻煩;或者您必須在客戶端執行所有模板,並且只使用您的服務器進行JSON。

我只是不明白分手的客戶機/服務器方式的未來,雖然有很多人聲稱誰這一切是怎麼回事的方向。看看彈出的大量JavaScript MVC框架。

0

隨着turbolinks 5.0.1,在控制器中添加選項turbolinks: false format.html { redirect_to @user, notice: 'User was created.', turbolinks: false }

其他解決方案(不太好,因爲它不會讓你更新到Rails的5.1)是堅持turbolinks 2.5.3 。

有可能是通過使用format.js甚至format.json其他解決方案,請檢查:https://github.com/vtamara/turbolinks_prob50