2015-06-30 72 views
0

我遇到了rails窗體(remote:true)及其操作的問題。 我正在使用Rails 4.Ruby on Rails:提交ajax後的表單問題

我有兩個部分。首先是一個包含所有條目的表格(例如工作包),其次是添加新條目的表格。我填寫表格並通過AJAX將其發送給我的控制器。之後,表單部分將重新呈現。到現在爲止還挺好。

現在是該形式在「編輯模式」的問題:

<form accept-charset="UTF-8" action="/workpackages/290" class="edit_workpackage" data-remote="true" id="edit_workpackage_290" method="post" role="form"> 

如果我想直接添加其他工作包,現在這是不可能的,因爲我想改變第一entrie。

如何確保公式創建後的「新模式」?

<form accept-charset="UTF-8" action="/workpackages" class="new_workpackage" data-remote="true" id="new_workpackage" method="post" role="form"> 

是否可以說出我想要的表單模式?如果按下「編輯」按鈕,則應始終可用「編輯模式」。

如果我刷新整個一面的形式是新的「新模式」。爲什麼不在ajax調用之後?

一些代碼:

控制器/創建

def create 
    respond_to do |format| 
     if (@workpackage.save) 

     #update current working time on workingtime Account 
     update_workingtime_account() 

     #get new infos about workingtime from current day and working account if a new workpackage was created 
     get_new_workingtime() 

     flash[:notice] = 'Arbeitspacket erfolgreich erfasst' 
     format.html { redirect_to @workpackage } 
     format.js {} 

     else 

     format.html { render :new } 
     flash[:notice] = 'Arbeitspacket konnte nicht gespeichert werden' 
     format.js {} 
     end 
    end 

create.js.erb

//AJAX renew Section table 
$(document).ready(function() { 
$('#workpackage-form').bind('ajax:success', function() { 

    $('#workpackage-table').html("<%= escape_javascript(render 'workpackages/table') %>"); 

    $('#workpackage-form').html("<%= escape_javascript (render partial: 'workpackages/form') %>"); 

    //re-initialize datetimepicker 
    $('.datetimepicker').datetimepicker({ format: 'LT' }); 

}); 

}); 

我希望解釋是非常明顯的。

回答

0

Rails根據自己的狀態(不管是否存在)自動決定是創建新記錄還是更新現有模型。

你不包含表單代碼,但我猜你有一個類似於以下內容:

<%= form_for @workpackage do |f| %> 
    ... 
<% end %> 

當您成功提交表單的第一次,形式重新呈現在create操作的上下文,因此@workpackage是一個持久對象,它會嘗試更新它。

如果你總是希望使用這種形式的創作,你可以做這個替代:

<%= form_for Workpackage.new do |f| %> 
    ... 
<% end %> 

如果您還允許版本通過相同的形式,一個常見的模式是採取form_for線出來的形成部分並將表單對象傳遞給部分。

new.html.erb

<%= form_for Workpackage.new do |f| %> 
    <%= render 'form', f: f %> 
<% end %> 

edit.html.erb

<%= form_for @workpackage do |f| %> 
    <%= render 'form', f: f %> 
<% end %> 

_form.html。erb

<%= f.text_field :one %> 
<%= f.text_field :two %> 
... 
+0

Thx,我想這會幫助我:)! – Kumaro