我正在尝试创建一个使用多个模型的多页面表单。我有一个申请人,这个申请人有一个以上的地址(一对多的关系)。
我希望第一页包含有关申请人的信息,然后是之后的页面,以获取地址表单
这就是我现在所拥有的:
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个,依此类推。我是以错误的方式来做这件事的吗?我怎么能有一个多页表单,有多个模型(相关),当从一个页面到另一个页面时,数据不会被删除..直到我最终到达最后一页我可以提交(并保存)所有型号..
如果有人能提供帮助,我将不胜感激。 谢谢。
答案 0 :(得分:0)
你当然可以使用它,但是(取决于你需要的步骤数量),它可能会变得非常复杂。
您是否考虑过在服务器端使用单个new
和create
请求,并使用Javascript将表单拆分为客户端的多个步骤?看起来这可能会简单得多。您的Rails应用程序的行为更像是标准的REST应用程序,您可以在客户端认为合适的情况下解决这个问题。
我自己没有使用它,但是像这样的jQuery插件应该可以解决这个问题: http://thecodemine.org/