Rails4, кокон, вложенные формы и has_many через

У меня есть что-то вроде фэнтези-футбольного приложения, которое я пытаюсь запустить и запустить. Прямо сейчас у меня есть модель User (с использованием Devise):

class User < ActiveRecord::Base
has_many :league_memberships
has_many :leagues, through: :league_memberships

accepts_nested_attributes_for :league_memberships

Есть модель Лиги:

class League < ActiveRecord::Base
    has_many :league_memberships
    has_many :users, through: :league_memberships    

    accepts_nested_attributes_for :league_memberships

И есть модель LeagueMembership:

class LeagueMembership < ActiveRecord::Base
    belongs_to  :league
    belongs_to  :user

    accepts_nested_attributes_for :user
    accepts_nested_attributes_for :league

Пользователь может быть членом многих лиг, а лига может иметь много пользователей.

Таким образом, когда пользователь хочет создать лигу, он / она делает это и может редактировать лигу, чтобы добавить / удалить дополнительных пользователей. Вот форма для редактирования лиги:

= simple_form_for @league do |f|
.panel-body
    .row
        .col-md-4
            = f.input :name, input_html: { class: 'form-control' }
            = f.input :description, input_html: { class: 'form-control' }

        .col-md-8
            %h3 League Members
            = f.simple_fields_for :league_memberships do |membership|
                = render 'membership_fields', f: membership
            = link_to_add_association 'Add Member', f, :league_memberships, class: 'btn btn-default'

= f.button :submit, class: 'btn btn-primary'

И часть "members_fields":

.nested-fields.col-md-8
    = f.association :user, collection: User.order(:username), prompt: 'Choose a new member'
    = link_to_remove_association "Remove member", f, class: "btn btn-default"

Когда я пытаюсь отредактировать существующую лигу, она выдает ошибку MissingTemplate и говорит, что ищет другую часть с именем _league_membership_fields.

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

РЕДАКТИРОВАТЬ: Вот строка, которая вызывает ошибку:

= link_to_add_association 'Add Member', f, :league_memberships, class: 'btn btn-default'

И теперь, похоже, я тоже не могу создавать новые лиги. Вот ЛигаКонтроллер:

class LeaguesController < ApplicationController

def new
    @leauge = League.new
    @league.league_memberships.build
end

def create
    @league = League.new(league_params)
    @league.league_memberships.build(user_id: current_user.id)
    if @league.save
        redirect_to @league
    else
        render 'new'
    end
end

def index
    @leagues = Leagues.paginate(page: params[:page])
end

def show
    @league = League.find(params[:id])
end

def edit 
    @league = League.find(params[:id])
end

def update
    @league = League.find(params[:id])
    if @league.update_attributes(league_params)
        flash[:success] = "League Updated!"
        redirect_to @league
    else
        render 'edit'
    end
end

private

def league_params
    params.require(:league).permit(
        :name, :description,
        users_attributes: [:id, :username, :name],
        league_memberships_attributes: [:league_id, :user_id]
    )
end

end

1 ответ

Я думаю, что мне удалось разобраться в моих проблемах.

Ошибка была правильной. Согласно моему коду выше, форма пыталась загрузить не ту часть. Я добавил еще один фрагмент, названный _league_membership_fields, как и должно быть, и теперь он работает.

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

Другие вопросы по тегам