Многостраничная многомодельная форма в Rails - PullRequest
2 голосов
/ 25 февраля 2012

Я пытаюсь создать многостраничную форму, которая использует несколько моделей. У меня есть заявитель, и у этого заявителя более одного адреса (отношения один ко многим).

Я хотел бы, чтобы на первой странице содержалась информация о заявителе, а затем на странице после этого была форма для адреса (ов)

Вот что у меня сейчас:

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, или grant_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>
...

И это все. Теперь у меня следующая проблема: я хочу сохранить информацию об адресе, а также информацию о заявителе. И я подумал, просто сказав: @ Applic.addresses.new, тогда они будут включены в информацию о сеансе заявителя, но не были (когда я получил страницу адреса, полей не было!). Поэтому я создал новую переменную сеанса для хранения информации об адресе. Но у меня есть проблема. Каждый раз, когда я перехожу с одной страницы на другую (в действии создания), новое поле адреса (со всеми его атрибутами) создается и добавляется в форму. Итак, сначала у меня есть один адрес, затем у меня 2 и так далее. Я поступаю об этом неправильно? Как я могу иметь многостраничную форму, с несколькими моделями (которые связаны), и при переходе с одной страницы на следующую, данные не стираются .. До тех пор, пока я в конечном итоге не достигну последней страницы, где я мог отправить (и сохранить) все модели ..

Буду признателен, если кто-нибудь сможет помочь .. Спасибо.

1 Ответ

0 голосов
/ 25 февраля 2012

Вы, конечно, можете заставить это работать, но (в зависимости от количества шагов, которое вам нужно), это может стать довольно запутанным.

Рассматривали ли вы использование одного запроса new и create на стороне сервера и использование Javascript для разбиения формы на несколько этапов на стороне клиента? Кажется, что это может быть намного проще. Ваше Rails-приложение будет вести себя как стандартное REST-приложение, и вы можете разбить его, если считаете нужным на стороне клиента.

Я не использовал его сам, но плагин jQuery, такой как этот, должен сделать свое дело: http://thecodemine.org/

...