lundi 17 août 2015

Rails creating a form on a show template with nested_attributes

I have a rails app with events and event_registrants, someone can essentially register for an event.

Here's my event model:

class Event < ActiveRecord::Base

  has_many :event_registrants, :dependent => :destroy
  accepts_nested_attributes_for :event_registrants, :reject_if => lambda { |a| a[:first_name].blank? }, :allow_destroy => true

Here's my event_registrant model:

class EventRegistrant < ActiveRecord::Base
  belongs_to :event

  attr_accessible :comment, :company, :email, :first_name, :last_name, :phone, :event_id

  validates_presence_of :company, :email, :first_name, :last_name, :phone
end

On the show template, I'd like to include a form to allow someone to register directly from there.

  <%= form_for @event do |f| %>
    <%= f.fields_for :event_registrants do |builder| %>
      <%= render "registration_form", :f => builder %>
    <% end %>
    <%= f.submit 'Send it', :class => "blue-btn", :id => "registrant_submit" %>
  <% end %>

Partial:

<ul class="form" id="register_form">
    <li><%= f.text_field :first_name, :placeholder => "First name *"  %> <%= f.text_field :last_name, :placeholder => "Last name *"  %></li>
    <li><%= f.text_field :email, :placeholder => "Email address *", :class => 'wide'  %></li>
        <li><%= f.text_field :company, :placeholder => "Company name *", :class => 'wide' %></li>
    <li><%= f.text_field :phone, :placeholder => "Phone number *", :maxlength => '14' %></li>
<li><%= f.text_area :comment, :placeholder => "Additional info", :class => 'wide', :rows => 4, :cols => 68 %></li>
</ul>

Finally my events controller'

  def show
    @event = Event.where(:event_hosting_type => "eureka_event").find_by_permalink(params[:id])
    1.times {@event.event_registrants.build}

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @event }
    end
  end

  def update
    @event = Event.find_by_permalink(params[:id])

    respond_to do |format|
      if @event.update_attributes(params[:event])
        format.html { redirect_to @event, notice: "#{@event.title} updated." }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end

  def create
    @event = Event.new(params[:event])
    @event_registrant = @event.build_event_registrant

    respond_to do |format|
      if @event.save
        format.html { redirect_to  @event, notice: 'New event created.'}
        format.json { render json: @event, status: :created, location: @event }
      else
        format.html { render action: "new" }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end

The issue I'm having is that the current form will display but will only update the current record, having 1.times {@event.event_registrants.build} will add a new, empty form but the previous entry will be there. I'd like someone to submit their info, have the form reset and allow someone else to submit new info.

Aucun commentaire:

Enregistrer un commentaire