Rails中的多页多模型表单

时间:2012-02-25 16:43:47

标签: ruby-on-rails-3 forms models one-to-many multipage

我正在尝试创建一个使用多个模型的多页面表单。我有一个申请人,这个申请人有一个以上的地址(一对多的关系)。

我希望第一页包含有关申请人的信息,然后是之后的页面,以获取地址表单

这就是我现在所拥有的:

applicant.rb

has_many :addresses, :dependent => :destroy     
accepts_nested_attributes_for :addresses

address.rb

belongs_to :applicant

applicants_controller.rb:

def new
  session[:applicant_params] ||= {}

  @applicant = Applicant.new(session[:applicant_params])
  2.times do
    @addresses=@applicant.addresses.build
  end

  session[:address_params] = @addresses.attributes

end

def create

  session[:applicant_params].deep_merge!(params[:applicant]) if params[:applicant]
  session[:address_params] ||= params[:address]
  @applicant = Applicant.new( session[:applicant_params] )
  @applicant.addresses.new(session[:address_params])



  if params[:forward_button] or params[:back_button]


    @applicant.current_step = session[:applicant_step] 

  if params[:back_button]
    @applicant.previous_step  
  else
    @applicant.next_step
  end

  session[:applicant_step]=@applicant.current_step

  render "new"

else

.....

在新视图中:

<%= form_for @applicant do |f| %>

  <%= render "#{@applicant.current_step}_step", :f => f %>
  <p><%= f.submit "Continue", :name => "forward_button" unless @applicant.last_step? %> </p>
  <p><%= f.submit "Back", :name => "back_button" unless @applicant.first_step? %></p>


<% end %>

@ applicant.current_step将是address_step或applicant_step,以下是:

_applicant_step.html.erb

<div class="field">
<%= f.label :first_name %><br />
<%= f.text_field :first_name ,:width=>'10px', :size=>"20", :maxlength=>"20" %>
</div>
<div class="field">
<%= f.label :middle_name %><br />
<%= f.text_field :middle_name %>
</div>
....

_address_step.html.erb

<%= f.fields_for :addresses do |u| %>
<div class="field">
    <%= u.label :address %><br />
    <%= u.text_area :address , :cols=> 20, :rows=>5%>
</div>
<div class="field">
    <%= u.label :telephone, "Telephone Number" %><br />
    <%=  u.text_field :telephone %>
</div>
...

就是这样。现在问题如下,我想保存地址信息以及申请人信息。我只想说:@ applicant.addresses.new然后他们将被包含在申请人的会话信息中,但他们不是(当我得到地址页面时,没有字段!)。所以我创建了一个新的会话变量来保存地址信息。但我有一个问题。每次我从一个页面转到另一个页面(在创建操作中)时,都会创建一个新的地址字段(包含其所有属性)并将其添加到表单中。所以首先我有一个地址,然后我有2个,依此类推。我是以错误的方式来做这件事的吗?我怎么能有一个多页表单,有多个模型(相关),当从一个页面到另一个页面时,数据不会被删除..直到我最终到达最后一页我可以提交(并保存)所有型号..

如果有人能提供帮助,我将不胜感激。 谢谢。

1 个答案:

答案 0 :(得分:0)

你当然可以使用它,但是(取决于你需要的步骤数量),它可能会变得非常复杂。

您是否考虑过在服务器端使用单个newcreate请求,并使用Javascript将表单拆分为客户端的多个步骤?看起来这可能会简单得多。您的Rails应用程序的行为更像是标准的REST应用程序,您可以在客户端认为合适的情况下解决这个问题。

我自己没有使用它,但是像这样的jQuery插件应该可以解决这个问题: http://thecodemine.org/