Невозможно создать form_for связанных моделей

Я пишу простое веб-приложение, которое мне нравится называть PMS (система управления проектами). В этом приложении у меня есть 2 модели Проекты и Студенты. Я установил (наверное... потому что я новичок) связь между этими двумя моделями. В проектах много студентов, но студент принадлежит к одному проекту (возможно, со временем это изменится).

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

Вот мои исходные файлы:

Контроллер проектов:

class ProjectsController < ApplicationController
  def show
    @projects = Project.all
  end

  def create
    @project = Project.new(project_params)
    @project.status = "Waiting"
    @project.save
    redirect_to root_path
  end

  private
    def project_params
      params.require(:project).permit(:title, :lecturer)
    end
end

Контроллер учащихся:

class StudentsController < ApplicationController
  def create
    @project = Project.find(params[:project_id])
    @student = @project.students.create(params[:student])
    @student.save
  end
end

Модели:

class Project < ActiveRecord::Base
  has_many :students
end

class Student < ActiveRecord::Base
  belongs_to :project
end

Просмотр:

Добавить новый проект

<%= form_for :project, url: projects_path do |f| %>
    <p>
        <%= f.label :title %>
        <%= f.text_field :title %>
    </p>
    <p>
        <%= f.label :lecturer %>
        <%= f.text_field :lecturer %>
    </p>
        <%= form_for([@project, @project.students.build]) do |s| %>
          <p>
            <%= s.label :name %><br />
            <%= s.text_field :name %>
          </p>
        <% end %>
    <p>
        <%= f.submit %>
    </p>
<% end %>

Маршруты:

RoRPMS::Application.routes.draw do
  # You can have the root of your site routed with "root"
  root 'projects#show'

  resources :projects do
    resources :students
  end
end

person cojoj    schedule 11.12.2013    source источник
comment
При использовании save необходимо проверять логический результат. Вы можете попробовать использовать save! вместо save, это вызовет исключение, если объект не может быть сохранен, указывая на ошибку.   -  person Baldrick    schedule 11.12.2013
comment
Хорошо, я понимаю, но это все еще не проблема, с которой я справляюсь...   -  person cojoj    schedule 11.12.2013


Ответы (1)


Вы также можете использовать «nested_form» для создания проекта со студентами.

<%= nested_form_for @project do |f| %>
    <p>
        <%= f.label :title %>
        <%= f.text_field :title %>
    </p>
    <p>
        <%= f.label :lecturer %>
        <%= f.text_field :lecturer %>
    </p>
        <%= fields_for :students do |s| %>
          <p>
            <%= s.label :name %><br />
            <%= s.text_field :name %>
          </p>
        <% end %>
        <%= f.link_to_add "Add new student", :students %>
    <p>
        <%= f.submit %>
    </p>
<% end %>

В модели проекта добавьте

accepts_nested_attributes_for :students
person jbmyid    schedule 11.12.2013
comment
Вы добавили гем nested_form в файл гем, если да, то какую ошибку вы получаете? - person jbmyid; 12.12.2013