Rails向导表单

时间:2016-02-15 11:03:45

标签: ruby-on-rails ruby-on-rails-4 activerecord erb

我有一个注册表单,用户可以在其中注册某种活动。

但是,我想给团队注册的可能性,我正在考虑一个类似于形式的向导。

一次创建5条记录。

问题是,我将在每一步创建一个新的注册,所以我认为wicked gem不会为这种情况做这件事。

你能否就我该如何处理这个问题给我一些指导?

如果从表单发送new attr,可能只是在创建后呈现i.e. team

也许使用自我加入?

这是我的头脑,但我知道必须有一个聪明的方法来做到这一点。

1 个答案:

答案 0 :(得分:0)

我不确定你的模型是如何构建的,但如果你有类似的东西:

class Attendee
  has_many :enrolments
  has_many :events, through: :enrolments
end

class Enrolment
  has_many :attendees
  belongs_to :event
end

class Event
  has_many :enrolments
  has_many :attendees, through: :enrolments
  accepts_nested_attributes_for :enrolments
end

然后你可以做类似的事情:

# controllers/enrolments_controller.rb
class EnrolmentController < ApplicationController
  def new
    @event = Event.find(params[:event_id])
    pax = params[:persons].to_i
    pax.times do
      @event.enrolments.build
    end
  end

  def create
    @event = Event.find(params[:event_id])
    @event.enrolments.build(enrolment_params)
    @event.save
  end

protected
  def enrolment_params
    # require specific parameters here
    params.require(:event).permit(:attendee_attributes => [])
  end
end

# views/enrolments/new.html.erb
<%= form_for @event, url: event_enrolments_path(@event) do |f| %>
  <%= f.hidden_field :event_id %>
  <%= f.fields_for :enrolments do |af| %>
    <%= af.select :attendee_id, Attendee.all.collect {|p| [ p.name, p.id ] } %>
  <% end %>
  <%= f.submit %>
<% end %>

# routes.rb
resources :events do
  resources :enrolments
end

这是我的头脑,但一般的想法是你根据params中传递的人数运行event.enrolments.build来构建嵌套字段。

这使用fields_for和accepts_nested_attributes_for。这也使得通过传入partial:

中的表单上下文来重用现有表单非常方便
<%= f.fields_for :enrolments do |af| %>
  <%= render "enrolments/form", f: af %>
<% end %>