2

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

我希望第一页包含有关申请人的信息,然后在后面的页面中包含地址表格

这就是我目前所拥有的:

申请人.rb

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

地址.rb

belongs_to :applicant

申请人控制器.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 或 application_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 个,依此类推。我会以错误的方式解决这个问题吗?我怎样才能拥有一个多页表单,具有多个模型(相关的),并且从一页转到下一页时,数据不会被删除..

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

4

1 回答 1

0

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

您是否考虑过在服务器端使用单个newcreate请求,并在客户端使用 Javascript 将表单分解为多个步骤?看起来这可能要简单得多。您的 Rails 应用程序将更像一个标准的 REST 应用程序,您可以将其分解为您认为适合客户端的任何方式。

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

于 2012-02-25T18:30:13.773 回答