2

複数のモデルを使用する複数ページのフォームを作成しようとしています。申請者がいて、この申請者には複数の住所があります (1 対多の関係)。

最初のページに申請者に関する情報を記載し、その後のページに住所のフォームを記載したいと考えています。

これは私が現時点で持っているものです:

申請者.rb

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

アドレス.rb

belongs_to :applicant

申請者_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 または 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 と言うだけで、応募者のセッション情報に含まれると思いましたが、そうではありませんでした (アドレス ページを取得したとき、フィールドはありませんでした!)。そこで、アドレス情報を保持する新しいセッション変数を作成しました。しかし、私には問題があります。(create アクションで) あるページから別のページに移動するたびに、新しい住所フィールド (すべての属性を含む) が作成され、フォームに追加されます。最初に 1 つのアドレスを取得し、次に 2 つのアドレスを取得します。私はこれについて間違った方法で進んでいますか?複数のモデル (関連するモデル) を含む複数ページのフォームを作成するにはどうすればよいですか? あるページから次のページに移動しても、データは消去されません..

誰か助けていただければ幸いです..ありがとう。

4

1 に答える 1

0

これは確かに機能しますが、(必要なステップの数によっては) かなり複雑になる可能性があります。

サーバー側で単一のnewandcreateリクエストを使用し、クライアント側で Javascript を使用してフォームを複数のステップに分割することを検討しましたか? これはもっと簡単にできるようです。Rails アプリケーションは標準の REST アプリケーションのように動作し、クライアント側で適切と思われる方法でこれを分割できます。

私はそれを自分で使用したことはありませんが、次のような jQuery プラグインがうまくいくはずです: http://thecodemine.org/

于 2012-02-25T18:30:13.773 に答える