Понимание переменной устойчивости рельсов с помощью jQuery - PullRequest
1 голос
/ 10 мая 2011

Когда я создаю новый объект через контроллер scaffolded, если я запускаю какой-то сценарий 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.

Почему@projectmilestone не сохраняется, когда я использую этот скрипт jquery, и сохраняется, когда я перехожу к функции создания моего скаффолда?

Большое спасибо !!!

1 Ответ

0 голосов
/ 11 мая 2011

Причина в том, что когда Rails отображает вашу страницу, переменная экземпляра, установленная вами в контроллере, разделяется между представлением и частями.Он является частью стека, на стороне сервера и отправляется клиенту в вашем браузере.

Но когда вы используете Ajax, вы работаете с клиентом, и сервер больше не знает о том, что он отправлял раньшеесли вы не вспомните его, отправив идентификатор объекта, над которым работаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...