【问题标题】:How to load partials on a multiple page form in Rails如何在 Rails 中的多页表单上加载部分内容
【发布时间】:2013-01-15 05:17:50
【问题描述】:

我正在尝试转换 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

create 操作是您在下一步和上一步之间移动的原因:

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 动作被调用时?当我在路线 users/new 上时,我填写表格并点击“下一步”。然后,当我在部分第 2 步并单击“下一步”时,我移至第 3 部分。我可以移回第 2 部分,但是当我尝试在第 2 部分上点击前一个时,没有任何反应。我没有被送回部分 1。现在无论我在路线上的任何部分仍然说 users/new 但我知道 create 操作被调用,因为我可以在部分 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 中,我需要渲染 。关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: ajax ruby-on-rails-3 jquery


    【解决方案1】:

    你所拥有的实际上是做什么的?

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

    因此,在您遇到问题时,current_step 可能远远超出您的 3 个步骤。

    【讨论】:

    • 我所拥有的什么都不做。当我单击“下一步”时,没有任何反应(这是将remote: true 添加到form_for)。我不知道如何通过 AJAX 在我的数组的下一步中准确加载部分?
    • 它可能是在不查看所有代码的情况下难以调试的任何数量的东西。我仍然肯定会清理我提到的东西。但是备份,如果您这样做,该页面是否会更新: $("#partial").html("test") ?
    • 是的,这行得通。我的 .js.erb 文件似乎没有看到我的 @user 实例变量。
    • 你把我建议的所有东西都清理干净了吗?我打赌你的 next_step 值已经超过了你的 3 个步骤,因为正如我指出的那样,它在每个步骤中都会增加 3 次。
    • 好的,js.erb 文件中应该是render @user.current_step。哪个也不起作用。
    猜你喜欢
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2011-10-05
    • 2016-06-08
    • 2016-01-25
    相关资源
    最近更新 更多