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

时间:2013-01-15 05:17:50

标签: 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
  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) %>");

我认为我被挂起的可能就是当创建与新动作被调用时?当我在路上 users / 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中,我需要渲染&lt;%=和%&gt;。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

你实际做了什么?

我确实看到你正在设置current_step,然后调用next_step,然后再次设置current_step。然后在js.erb文件中再次调用next_step,这意味着current_step每次传递都会更改3次。

因此,当你遇到问题时,current_step很可能超出你的3个步骤。