【问题标题】:Understanding rails variable persistence with jQuery使用 jQuery 了解 Rails 变量持久性
【发布时间】:2011-05-10 19:12:40
【问题描述】:

当我通过脚手架控制器创建一个新对象时,如果我将一些 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 %>

利益相关者部分是这样的:

<%= 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 值时,会在我的 application.js 文件中触发一个 javascript 函数:

$('#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 为 nil。

为什么当我使用这个 jquery 脚本时@projectmilestone 没有持久化,而当我转到脚手架的创建功能时,@projectmilestone 没有持久化?

非常感谢!!!

【问题讨论】:

    标签: jquery ruby-on-rails forms object


    【解决方案1】:

    原因是当 Rails 渲染你的页面时,你在控制器中设置的实例变量在视图和局部视图之间共享。 它是堆栈的一部分,服务器端并在您的浏览器中发送到客户端。

    但是当您使用 Ajax 时,您是在客户端工作,而服务器不再知道它之前发送的内容,除非您通过发送您正在处理的对象的 id 来回忆它。

    【讨论】:

    • 感谢您的回答。对象的 id 不是我保存(sql 插入)对象时将在数据库中设置的那个,对吧?那么如何将这个对象 id 发送到控制器并让控制器在我的 update_user_select 方法中使用它呢?
    • 你是对的,它不是未来 db​​ 对象的 id。但是要保存单个对象,您应该生成与已经存在的 html 一致的 html。也许手动而不是使用表单助手会更容易。您可以从 Ryan Bates 代码中获得灵感。见github.com/ryanb/nested_form
    • 我看过了,但是对我来说太复杂了...现在,作为一种解决方法,我添加了 @projectmilestone = params[:id].to_i != 0 ? Projectmilestone.find(params[:id]) :我的控制器功能中的 Projectmilestone.new。尽管它不是很优雅,但它似乎可以完成这项工作......谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-07-05
    • 2015-08-16
    • 2014-05-21
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    相关资源
    最近更新 更多