用jQuery理解rails变量持久性

用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

当我通过搭建的控制器创建一个新对象时,如果我在表单中执行一些jquery脚本,并且这些脚本触发了控制器中的一个函数,那么这个函数不知道我刚才创建的对象。为什么?

让我解释一下:

在控制器中,我首先创建对象:

  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