我正在尝试转换 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" %>
我的create.js.erb看起来像这样。
$("#partial").html("<%= escape_javascript(render @user.current_step) %>");
我想我被挂断的可能是当 create 与 new 动作被调用时?当我在路由用户/新用户上时,我填写表格并单击“下一步”。然后,当我在部分第 2 步并单击“下一步”时,我移动到部分 3。我可以移回部分 2,但是当我尝试在部分 2 上点击前一个时,没有任何反应。我没有被送回部分 1。现在无论我在路线上的任何部分仍然说用户/新,但我知道创建 操作被调用,因为我可以在部分 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 中,我需要渲染 <%= 和 %>。关于如何解决这个问题的任何想法?