ruby中的三重嵌套属性.不确定我是否正确设置了它们,或者它们是否可以完成.红宝石



我有一个三重嵌套属性,我试图在一个表单中捕获所有信息。简而言之,我有一条事件,它有很多event_location,有很多event_dates,有很多event_roles。我的活动中的表格是新的。我认为问题出在我的事件模型中,我需要说的是,event_dates和event_role还有其他"accepts_nested_attributes_for",因为现在在event_params中,我确实获得了事件和event_location信息。

events controller
        def create
          @event = Event.new(event_params)
          if @event.save
              redirect_to @event, notice: 'Event was successfully created.'
          else
              render :new
          end
        end
private
   def event_params
        params.require(:event).permit(:name, :event_details, event_locations_attributes: [:label, :address, :zip, :state, :country, :notes], event_dates_attributes: [:event_date, :start_time, :end_time], event_roles_attributes: [:type, :hourly_rate, :quantity])

    event.rb
class Event < ActiveRecord::Base
    has_many :event_locations, :dependent => :destroy
    has_many :event_dates, through: :event_locations
    belongs_to :agency
    accepts_nested_attributes_for :event_locations, :allow_destroy => true

event new
<h3> New Event </h3>
    <%= form_for @event do |f| %>
            <%= f.text_field :name, :required => true, placeholder: "Name", :maxlength => 200, class: "form-control title_input_field" %><br>
            <%= f.text_area :event_details, :required => true, placeholder: "What are some of the event details", size: "100x10", class: "input_field2" %> <br>

            <h3> Event Locations </h3>
            <%= f.fields_for :event_locations do |builder| %>
                <%= render "location_fields", :f => builder %>
            <% end %>
            <%= f.submit "Create!", :class => 'submit_button' %>

<%结束%>

_location_fields.html.erb
<p>
    <div class="row">
        <div class="col-sm-5">
            <%= f.text_field :label, :required => true, placeholder: "Label", :maxlength => 1000, class: "form-control title_input_field" %><br>
        </div>
        <div class="col-sm-5">      
            <%= f.text_area :notes, :required => true, placeholder: "Notes", :maxlength => 200, class: "form-control title_input_field" %><br>
        </div>
    </div>
    <div class="row">
        <div class="col-sm-5">      
            <%= f.text_field :address, :required => true, placeholder: "Address", :maxlength => 200, class: "form-control title_input_field" %><br>
        </div>  
        <div class="col-sm-2">  
            <%= f.text_field :state, :required => true, placeholder: "State / Provience", :maxlength => 200, class: "form-control title_input_field" %><br>
        </div>  
        <div class="col-sm-2">  
            <%= f.text_field :country, :required => true, placeholder: "Country", :maxlength => 200, class: "form-control title_input_field" %><br>
        </div>
        <div class="col-sm-2">      
            <%= f.text_field :zip, :required => true, placeholder: "Zip Code", :maxlength => 200, class: "form-control title_input_field" %><br>
        </div>
    </div>      
            <%= f.check_box :_destroy %>
            <%= f.label :_destroy, "Remove Location" %>
</p>
    <%= f.fields_for :event_date do |builder| %>
        <%= render "event_date_fields", :f => builder %>    
    <% end %>

--

_event_date_fields.html.erb
<p>
    <h3> Event Date </h3>
    <div class="row">
        <div class="col-sm-3">
            <div class="form-group">
                <div class='input-group date' id='datetimepicker1' />
                  <%= f.text_field :event_date, placeholder: "Select Event Date", class: "form-control", type:'text' %>
                  <span class="input-group-addon">
                    <span class="glyphicon glyphicon-calendar"></span>
                  </span>
                </div> <!-- date -->
            </div> <!-- form-group -->
        </div>
        <div id="datepairExample">
            <div class="col-sm-4">
              <%= f.text_field :start_time, placeholder: "Start Time", class: 'time start form-control' %> 
            </div>
            <div class="col-sm-1">to</div>
            <div class="col-sm-4">
              <%= f.text_field :end_time, placeholder: "End Time", class: 'time end form-control' %> 
            </div>
        </div>
    </div>

    <%= f.check_box :_destroy %>
    <%= f.label :_destroy, "Remove Date" %>
</p>
<%= f.fields_for :event_role do |builder| %>
    <%= render "event_role_fields", :f => builder %>    
<% end %>

简而言之,您需要允许所有模型为其直接关联允许嵌套属性,因此:

class Event < ActiveRecord::Base
  has_many :event_locations, :dependent => :destroy
  accepts_nested_attributes_for :event_locations, :allow_destroy => true
class EventLocation < ActiveRecord::Base
  has_one :event_date
  accepts_nested_attributes_for :event_date, allow_destroy: true
class EventDate < ActiveRecord::Base
  has_one :event_role
  accepts_nested_attributes_for :event_role, allow_destroy: true

那么你的强参数应该是这样的:

    params.require(:event).permit(:name, :event_details,
      event_locations_attributes: [:label, :address, :zip, :state, :country, :notes,
        event_date_attributes: [:event_date, :start_time, :end_time,
          event_role_attributes: [:type, :hourly_rate, :quantity]]])

相关内容

最新更新