2016-03-31 2 views
0

Хотя я хотел бы добавить link_to_add с использованием simple_nested_form_for, была отображена следующая ошибка.Rails & JQuery: неверная ассоциация. Убедитесь, что accepts_nested_attributes_for используется для

ArgumentError (Invalid association. Make sure that accepts_nested_attributes_for is used for :events association.):

Есть подобные вопросы в StackOverflow, но она не работает для меня. Поэтому я публикую это как новый вопрос.

Ошибка была возникна, когда я добавлял f.link_to_add в _schedule_form.html.erb.

_schedule_form.html.erb

<%= f.label :title %> 
<%= f.text_field :title, class: 'form-control' %> 
<br> 
<%= f.label :departure_date %> 
<div class="input-group date" id="datetimepicker"> 
    <%= f.text_field :departure_date, class: 'form-control' %> 
    <span class="input-group-addon"> 
    <span class="glyphicon glyphicon-calendar"></span> 
    </span> 
</div> 
<script type="text/javascript"> 
    $(function() { 
    $('#datetimepicker').datetimepicker({format:'MMM-DD-YYYY'}); 
    }); 
</script> 
<br> 
<div id="room"> 
    <%= f.simple_fields_for :rooms do |a| %> 
    <p class="day-number-element-selector"><b>Day&nbsp;<%= a.index.to_i + 1 %></b></p> 
    <div id="event"> 
     <% a.simple_fields_for :events do |e| %> 
     <%= e.input :from %> 
     <% end %> 
    </div> 

    #add here!!! 

    <%= f.link_to_add "Add event", :events, data: {target: '#event'}, class: "btn btn-primary" %> 

    <%= a.input :room %> 

    <% end %> 
</div> 

new_html.erb

<div class="row"> 
    <div class="col-md-12"> 
    <p>Create schedule</p> 
    <%= simple_nested_form_for(@schedule) do |f| %> 
     <%= render 'schedule_form', f: f %> 
     <%= f.submit "Create my schedule", class: "btn btn-primary" %> 
     <br> 
    <% end %> 
    </div> 
</div> 

Дайте следующие модели:

class Schedule < ActiveRecord::Base 
    belongs_to :user 
    has_many :rooms 
    accepts_nested_attributes_for :rooms, allow_destroy: true 
    ... 

class Room < ActiveRecord::Base 
    belongs_to :schedule 
    has_many :events 
    accepts_nested_attributes_for :events, allow_destroy: true 
    ... 

class Event < ActiveRecord::Base 
    belongs_to :room 
    ... 

schedule_ controller.rb

class SchedulesController < ApplicationController 
... 
    before_action :set_schedule, only: %i(show edit update destroy) 
... 
    def new 
    @schedule = Schedule.new 
    room = @schedule.rooms.build 
    room.events.build 
    end 

    def create 
    @schedule = current_user.schedules.build(schedule_params) 
    if @schedule.save 
     flash[:success] = "schedule created!" 
     redirect_to root_url 
    else 
     render 'new' 
    end 
    end 

    def edit 
    @day_max = Room.where("schedule_id = ?", @schedule.id).maximum(:day) 
    end 

    def update 
    @schedule.rooms.maximum(:day) 
    if @schedule.update(schedule_params) 
     flash[:success] = "schedule updated!" 
     redirect_to root_url 
    else 
     render 'edit' 
    end 
    end 

    private 

    def schedule_params 
     params.require(:schedule).permit(:title, :departure_date, rooms_attributes: [:id, :_destroy, :room, :day, events_attributes: [:id, :_destroy, :from, :to, :title, :detail]]) 
    end 

    def set_schedule 
     @schedule = Schedule.find(params[:id]) 
    end 

Нет ошибок экспонировались перед добавлением link_to_add.

Было бы полезно, если бы вы могли дать мне какое-либо предложение.

РЕШЕННЫЙ !!!

<div id="room"> 
    <%= f.simple_fields_for :rooms do |a| %> 
     <div id="room_<%= a.object.object_id %>"> 
     <p class="day-number-element-selector"><b>Day&nbsp;<%= a.index.to_i + 1 %></b></p> 

     <%= a.simple_fields_for :events do |e| %> 
      <span class="form-inline"> 
      <%= e.input :from, label: false %>&nbsp;&nbsp; 
      <%= e.input :to, label: false%> 
      </span> 
      <%= e.input :title, label: 'event' %> 
     <% end %> 
     </div> 

     <%= a.link_to_add "Add event", :events, data: {target: "#room_#{a.object.object_id}"}, class: "btn btn-primary" %> 

     <%= a.input :room %> 

    <% end %> 
    </div> 
+1

попробовать это: '<% = a.link_to_add "Добавить событие",: события, data: {target: '#event'}, class: "btn btn-primary"%> ' –

+0

Спасибо за ваш быстрый ответ, @ Muhammad Yawar Ali. При создании новых данных не было обнаружено ошибок, и «событие» было сохранено. Но данные события не отображаются, когда я пытаюсь редактировать данные. Было бы хорошо, если бы вы могли подумать. – SamuraiBlue

ответ

1

div#room должны быть что-то вроде:

<div id="room"> 
    <%= f.simple_fields_for :rooms do |a| %> 
    <p class="day-number-element-selector"><b>Day&nbsp;<%= a.index.to_i + 1 %></b></p> 

     <% a.simple_fields_for :events do |e| %> 
     <div id="event"> 
     <%= e.input :from %> 
     </div> 
     <% end %> 
    #add here!!! 

    <%= a.link_to_add "Add event", :events, data: {target: '#event'}, class: "btn btn-primary" %> 

    <%= a.input :room %> 

    <% end %> 
</div> 
+0

Спасибо за ваш ответ, @Muhammad Yawar Ali. Хотя я пробовал ваш код, он был невосприимчив, когда я нажимаю 'link_to_add'. Было бы хорошо, если бы вы могли дать мне другое предложение. – SamuraiBlue

+0

Вы пробовали 'f' вместо' a' '<% = f.link_to_add" Добавить событие ",: события, данные: {target: '#event'}, класс:" btn btn-primary "%>' –

+0

Спасибо за ваш комментарий, @ Мухаммад Явар Али. Хотя я попробовал 'f' вместо' a', 'Invalid association. Убедитесь, что accepts_nested_attributes_for используется для: event association.'. – SamuraiBlue

0

Прежде всего nested_form драгоценный камень оставлена, так что я бы предложил использовать cocoon, которая до настоящего времени в настоящее время

Кроме того, вероятно, вы атрибуты фильтрованной

room_attributes: [..., events_attributes: [...]] 

Как ваши атрибуты для комнат должно быть во множественном числе комнат_значений

И последнее предложение не использует много гнездования. Попробуйте взглянуть на форме объектов рисунка на

Надеются, что это помогает

+0

Благодарим вас за ответ @Sergey. Я не знал, что камень nested_form заброшен. Спасибо за информацию. Хотя я попытаюсь использовать кокон позже, было бы полезно, если бы вы могли дать мне какие-либо идеи. Поскольку я изменил 'room_attributes' на' rooms_attributes', результат будет таким же. – SamuraiBlue

+0

, как указал в своем ответе Мухаммад Явар Али, похоже, что вы вызываете link_to_add на неправильный объект form_object.вы вызываете его на 'f', когда его нужно вызвать на' a' – mgidea

Смежные вопросы