Ajax 如何在Rails中的多页表单上加载分区

Ajax 如何在Rails中的多页表单上加载分区,ajax,ruby-on-rails-3,jquery,Ajax,Ruby On Rails 3,Jquery,我正试图改变Railscast#217。我想更改一个多部分表单,以便它使用AJAX加载部分。 我有一个用户可以注册的网站。我有一份由三部分组成的登记表(_step1.html.erb到_step3.html.erb) user.rb包含一组部分名称和方法,用于执行下一步和上一步: def current_step @current_step || steps.first end def steps %w[step1 step2 step3] end def next_step s

我正试图改变Railscast#217。我想更改一个多部分表单,以便它使用AJAX加载部分。 我有一个用户可以注册的网站。我有一份由三部分组成的登记表(_step1.html.erb到_step3.html.erb)

user.rb包含一组部分名称和方法,用于执行下一步和上一步:

def current_step
  @current_step || steps.first
end

def steps
  %w[step1 step2 step3]
end

def next_step
  self.current_step = steps[steps.index(current_step) + 1]
end

def previous_step
  self.current_step = steps[steps.index(current_step) - 1]
end

def first_step?
  current_step == steps.first
end

def last_step?
  current_step == steps.last
end
新的操作将为此启动:

def new
  @user = User.new
  session[:user_step] = nil
end
创建操作可在下一步和上一步之间移动:

def create
  @user = User.new(params[:user])
  respond_to do |format|
    format.js do
      @user.current_step = session[:user_step]
      if params[:prev_button]
        @user.previous_step
      elsif @user.last_step?
        @user.save
      else
        @user.next_step
      end
      session[:user_step] = @user.current_step
    end
  end
end
单击表单上的“下一步”时,new.html.erb文件将呈现以下部分内容:

<%= form_for(@user, :html => { :class => "form-horizontal" }, remote: true) do |f| %>
<div id="partial">
  <%= render @user.current_step, :f => f %>
</div>
<%= f.submit "Previous", class: "btn btn-primary", :name => "prev_button"   %>
<%= f.submit "Next", class: "btn btn-primary", :name => "next_button" %>
{:class=>“form horizontal”},remote:true)do | f |%>
f%>
“上一个按钮”%>
“下一步按钮”%>
我的create.js.erb如下所示

$("#partial").html("<%= escape_javascript(render @user.current_step) %>");
$(“#部分”).html(“”);
我想我被挂断的可能是当创建vs新动作被调用的时候?当我在路线用户/new上时,我填写表格并单击“下一步”。然后,当我在第二部分中并单击“下一步”时,我将进入第三部分。我可以回到第2部分,但当我尝试在第2部分上点击上一个时,什么也没有发生。我没有被送回第1部分。现在,无论我在哪一部分,我仍然会说用户/new,但我知道创建操作正在被调用,因为我可以在第2部分和第3部分之间切换,而不是返回第1部分。现在,第2部分和第3部分中只有文本,但第1部分如下所示:

<div class="control-group">
  <%= f.label :first_name, :class => 'control-label' %>
  <div class="controls">
    <%= f.text_field :first_name, class: 'required' %>
  </div>
</div>

<div class="control-group">
  <%= f.label :last_name, :class => 'control-label' %>
  <div class="controls">
    <%= f.text_field :last_name, class: 'required' %>
  </div>
</div>

'控件标签'%>
'控件标签'%>
有什么想法吗


我想我看到了问题所在。当我加载第2部分和第3部分时,我只渲染文本。但在第1部分中,我需要渲染。有什么办法可以解决这个问题吗?

你的实际工作是什么

我确实看到您正在设置当前的步骤,然后在调用下一个步骤之后,再次设置当前的步骤。然后在js.erb文件中再次调用next_步骤,这意味着当前_步骤在每次传递时会更改3次


因此,在您看到问题的时候,当前的步骤可能远远超出了您的3个步骤。

我所拥有的什么都不起作用。当我单击“下一步”时,什么也没有发生(这是在
remote:true
添加到
form\u中的
)。我不知道如何准确地通过AJAX加载数组的下一步中的部分内容?如果不查看所有代码,可能有很多事情很难调试。我还是会把我提到的东西清理干净的。但是备份时,如果您这样做,页面是否会更新:$(“#partial”).html(“test”)?是的,这很有效。我的.js.erb文件似乎没有看到我的
@user
实例变量。你是否清理了我建议的所有内容?我打赌你的下一步值已经超过了你的3步,因为正如我所指出的,它在每一步中都会增加3倍。好的,这应该是js.erb文件中的
render@user.current\u step
。这也不起作用。