Ajax 如何在Rails中的多页表单上加载分区
我正试图改变Railscast#217。我想更改一个多部分表单,以便它使用AJAX加载部分。 我有一个用户可以注册的网站。我有一份由三部分组成的登记表(_step1.html.erb到_step3.html.erb) user.rb包含一组部分名称和方法,用于执行下一步和上一步: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
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
。这也不起作用。