2016-12-27 6 views
0

Я следил за этим railscast: https://www.youtube.com/watch?v=t_FNKR7jahM, чтобы узнать, как реализовать вложенные атрибуты в моем приложении. Когда я реализую его код в определенных областях, я всегда получаю такую ​​же ошибку NoMethod в полях. enter image description hereПоля ошибок NoMethod Вложенные атрибуты

На странице событий, где вы можете добавлять песни, я пытаюсь добавить ссылку «Добавить поле», которая добавит еще одну группу песен (поле для исполнителя, название и жанр).

Вот мой EventController:

class EventsController < ApplicationController 

    def new 
     @event = Event.new 
     @event.songs.build 
    end 

    def index 
     @songs = Song.all 
    end 

    def show 
     @event = Event.find(params[:id]) 
     @songs = @event.songs.paginate(page: params[:page]) 
    end 

    def create 
     @event = current_user.events.build(event_params) 
     if @event.save 
      flash[:success] = "Event Created!" 
      redirect_to user_path(@event.user) 
     else 
      render 'welcome#index' 
     end 
    end 

    def destroy 
    end 

    private 

     def event_params 
     params.require(:event).permit(:name, :partycode, song_attributes: [:artist, :title, :genre]) 
     end 
end 

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

class Event < ApplicationRecord 
    belongs_to :user 
    has_many :songs, dependent: :destroy 
    accepts_nested_attributes_for :songs, allow_destroy: true 

    validates :name, presence: true 
    validates :partycode, presence: true, length: {minimum: 5} 
end 

Вот показать страницу, в которой добавлены песни:

<section class="song_form"> 
     <%= render 'shared/song_form' %> 
     <%= form_for @event do |f| %> 
     <%= f.fields_for :fields do |builder| %> 
      <%= render 'events/songs_fields', f: builder %> 
     <% end %> 
     <%= link_to_add_fields "Add Field", f, :fields %> 
     <% end %> 
</section> 

Вот файл song_fields:

<fieldset> 
    <%= f.select :field_type, %w[text_field check_box] %> 
    <%= f.text_field :artist, placeholder: "Artist" %> 
</fieldset> 

Вот файл ApplicationHelper:

module ApplicationHelper 
    def link_to_add_fields(name, f, association) 
    new_object = f.object.send(association).klass.new 
    id = new_object.object_id 
    fields = f.fields_for(association, new_object, child_index: id) do |builder| 
     render(association.to_s.singularize + "_fields", f: builder) 
    end 
    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")}) 
    end 
end 

Наконец, вот мой файл событий кофе сценарий;

$(document).on 'click', 'form .add_fields', (event) -> 
    time = new Date().getTime() 
    regexp = new RegExp($(this).data('id'), 'g') 
    $(this).before($(this).data('fields').replace(regexp, time)) 
    event.preventDefault() 

Извините за длинный пост, ответ на мой вопрос будет НАСТОЯТЕЛЬНО оценен. Сообщите мне, есть ли что-нибудь еще от меня (обратите внимание, что я использую рельсы 5). Ура :)

+0

"[...] та же ошибка NoMethod на полях"? И эта ошибка? –

+0

Ошибка, которую он мне дает: undefined method 'fields 'for # Aaron

ответ

1

Должно быть

f.fields_for :songs do |builder| 
+0

Спасибо, что исправлены ошибки полей. Теперь я получаю ошибку NoMethod для field_type (которая определена в моем файле song_field выше) – Aaron

+0

Имеет ли 'Song' поле под названием' field_type'? – Iceman

+0

Нет, не знаю, как бы это определить для моей песни? – Aaron