當我通過腳手架控制器創建一個新對象時,如果我將一些jquery腳本操作到我的窗體中,並且這些腳本在我的控制器中觸發一個函數,則此函數不知道對象I剛創建。爲什麼?瞭解使用jQuery的rails可變持久性
讓我解釋一下:
在我的控制,我首先要創建我的對象:
def new
@projectmilestone = Projectmilestone.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @projectmilestone }
end
end
在我看來,我有一個表格有一個嵌套的部分:
<%= semantic_form_for [:projects,@projectmilestone] do |form| %>
<%= form.semantic_errors :state %>
<%= form.inputs do %>
<%= form.input :department_id, :as => :select, :collection => Department.all%>
<div id="stakeholders">
<%=render :partial => "stakeholders", :locals => {:users => @users }%>
</div>
<% end %>
<%= form.submit "Submit" %>
<% end %>
的利益相關者部分是這樣的:
<%= semantic_form_for [:projects,@projectmilestone], :remote => true do |form| %>
<%= form.inputs :partial do %>
<%= form.input :user_id , :as => :select, :collection => users %>
<% end %>
<% end %>
當我改變DEPARTMENT_ID值,JavaScript函數觸發我的application.js文件:
$('#projectmilestone_department_id').live('change', function() {
// make a POST call and replace the content
var department = $('select#projectmilestone_department_id :selected').val();
if(department == "") department="0";
var milestone = $('#form_id').html();
jQuery.get('/projects/projectmilestones/update_user_select/' + department, function(data){
$("#stakeholders").html(data);
})
return false;
});
這個函數調用函數update_user_select在我的控制器:
def update_user_select
users=""
users = User.where(:department_id=>params[:department_id]) unless params[:department_id].blank?
render :partial => "stakeholders", :locals => {:users => users }
end
的用戶部分應該再重新加載我的表單,但它不會因爲@projectmilestone爲零。
爲什麼@projectmilestone在我使用這個jquery腳本時沒有持久化,並且在我去腳手架的創建函數時持久化?
非常感謝!
感謝您的回答。當我保存(sql插入)對象時,對象的id不是在db中設置的對象,對吧?那麼,如何將此對象ID發送給控制器,並讓控制器在我的update_user_select方法中使用它? – ndemoreau 2011-05-10 20:58:36
你是對的,它不是未來的數據庫對象的ID。但爲了保存單個對象,您應該生成與已存在的html一致的html。也許手動執行而不是使用表單助手會更容易。你可以在瑞安貝茨代碼中獲得靈感。看到https://github.com/ryanb/nested_form – apneadiving 2011-05-10 21:22:27
我看了一下,但對我來說太複雜了......現在,作爲解決方法,我添加了@projectmilestone = params [:id] .to_i!= 0 ? Projectmilestone.find(params [:id]):我的控制器函數中的Projectmilestone.new。儘管事實上它不是非常優雅,但它似乎能夠完成這項工作......謝謝! – ndemoreau 2011-05-10 21:38:21