2015-08-18 2 views
1

У меня есть приложение rails с событиями и event_registrants, кто-то может по существу зарегистрироваться для события.Рельсы, создающие форму в шаблоне show с вложенными_трибутами

Вот моя модель событий:

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 

Вот моя event_registrant модель:

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 

На шаблоне шоу, я хотел бы включить форму, чтобы позволить кому-то регистрироваться непосредственно оттуда.

<%= 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 %> 

Частичное:

<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> 

Наконец мой контроллер событий»

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 

Проблема у меня в том, что текущая форма будет отображаться, но будет только обновить текущую запись , имея 1.times {@event.event_registrants.build}, добавит новую, пустую форму, но предыдущая запись будет там. Я бы хотел, чтобы кто-то представил свою информацию, сбросил форму и разрешил кому-то еще отправлять новую информацию.

+0

Можете ли вы опубликовать журнал параметров? А также вы можете немного объяснить, что вы делаете? Вы создаете форму или обновление? – Pavan

+0

Уверен, у меня есть несколько событий в моем приложении. Для каждого события я хочу разрешить кому-то зарегистрироваться для него на странице показа событий. Форма event_registrants помещается в шоу событий, поэтому я хотел бы создать новую запись регистратора каждый раз при отправке формы. –

ответ

0

Вы можете обновить код, чтобы сказать

1.times {@event.event_registrants.build} if @event.event_registrants.empty? 

Ваша форма будет правильно показать значение event_registrants, если она существует, или построить его, если нет.

Однако, если вы хотите динамически добавлять или удалять поля формы, вы можете найти драгоценный камень cocoon простым способом обработки javascript/ruby, связанного с этим.