用jQuery理解rails变量持久性
当我通过搭建的控制器创建一个新对象时,如果我在表单中执行一些jquery脚本,并且这些脚本触发了控制器中的一个函数,那么这个函数不知道我刚才创建的对象。为什么? 让我解释一下: 在控制器中,我首先创建对象:用jQuery理解rails变量持久性,jquery,ruby-on-rails,forms,object,Jquery,Ruby On Rails,Forms,Object,当我通过搭建的控制器创建一个新对象时,如果我在表单中执行一些jquery脚本,并且这些脚本触发了控制器中的一个函数,那么这个函数不知道我刚才创建的对象。为什么? 让我解释一下: 在控制器中,我首先创建对象: def new @projectmilestone = Projectmilestone.new respond_to do |format| format.html # new.html.erb format.xml { render :xm
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 %>
此函数调用“我的控制器”中的函数“更新用户选择”:
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为零
为什么当我使用这个jquery脚本时@projectmilestone没有被持久化,而当我转到脚手架的create函数时@projectmilestone被持久化
非常感谢 原因是当Rails呈现页面时,您在控制器中设置的实例变量在视图和部分之间共享。 它是堆栈的一部分,服务器端,并在浏览器中发送到客户端
但是当您使用Ajax时,您是从客户机开始工作的,服务器不再知道它以前发送了什么,除非您通过发送您正在处理的对象的id来回忆它。谢谢您的回答。对象的id不是我保存(sql插入)对象时在db中设置的id,对吗?那么,我如何将这个对象id发送给控制器,并让控制器在我的update\u user\u select方法中使用它呢?没错,它不是未来db对象的id。但要保存单个对象,您应该生成与现有html一致的html。也许手动操作比使用表单助手更容易。你可以从Ryan Bates的代码中获得灵感。看,我看了一下,但对我来说太复杂了。。。现在,作为一种解决方法,我将@projectmilestone=params[:id]添加到了_I!=0 ? Projectmilestone.find(params[:id]):Projectmilestone.new在我的控制器函数中。尽管它不是很优雅,但它似乎能胜任这项工作。。。谢谢
$('#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;
});
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