Не могу заставить кокон работать на Ruby on Rails 4

Я боролся, пытаясь заставить это работать в течение последних нескольких часов, и я просто не могу по какой-то причине. Я выполнил шаги почти точно так, как указано в ссылке на репозиторий github.

Я создал новое приложение, используя все следующие шаги:

# rails new demo_app
# cd demo_app/
+++ added gem 'cocoon' to the Gemfile
+++ added //= require cocoon to the application.js file
# rails g scaffold Project name:string description:string
# rails g model Task description:string done:boolean project:belongs_to
+++ added has_many :tasks to the Project model
+++ added :_destroy to the permit in my projects_controller.rb file
# bundle install

Вот мой файл views/projects/_form.html.erb:

<%= form_for(@project) do |f| %>
  <% if @project.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@project.errors.count, "error") %> prohibited this project from being saved:</h2>

      <ul>
      <% @project.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :description %><br>
    <%= f.text_field :description %>
  </div>
  <%= f.fields_for :tasks do |task| %>
    <%= render 'task_fields', :f => task %>
    <%= link_to_add_association 'Add task', f, :tasks, class: "links" %>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Теперь вот мой файл views/projects/_task_fields.html.erb:

 <div id="nested-fields">
  <div class="field">
      <%= f.label :description %><br>
      <%= f.text_field :description %>
  </div>

  <div class="field">
      <%= f.label :description %><br>
      <%= f.text_field :description %>
  </div>
  <%= link_to_remove_association 'remove task', f %>
 </div>                 

Разве это не то, что упоминает руководство? Когда я иду, чтобы создать новый проект, он не показывает ничего, кроме метки имени по умолчанию, текстового поля имени, метки описания, текстового поля описания и ссылки «создать проект». Вот вывод HTML новой формы проекта:

<!DOCTYPE html>
<html>
<head>
  <title>DemoApp</title>
  <link data-turbolinks-track="true" href="/assets/projects.css?body=1" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/assets/scaffolds.css?body=1" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/assets/application.css?body=1" media="all" rel="stylesheet" />
  <script data-turbolinks-track="true" src="/assets/jquery.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/jquery_ujs.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/turbolinks.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/projects.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/cocoon.js?body=1"></script>
<script data-turbolinks-track="true" src="/assets/application.js?body=1"></script>
  <meta content="authenticity_token" name="csrf-param" />
<meta content="uIpLnix47UNaBONCR+0SV/uz1uiulU6BHqKe5qENzHQ=" name="csrf-token" />
</head>
<body>

<h1>New project</h1>

<form accept-charset="UTF-8" action="/projects" class="new_project" id="new_project" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="uIpLnix47UNaBONCR+0SV/uz1uiulU6BHqKe5qENzHQ=" /></div>

  <div class="field">
    <label for="project_name">Name</label><br>
    <input id="project_name" name="project[name]" type="text" />
  </div>
  <div class="field">
    <label for="project_description">Description</label><br>
    <input id="project_description" name="project[description]" type="text" />
  </div>
    <div class="actions">
    <input name="commit" type="submit" value="Create Project" />
  </div>
</form>

<a href="/projects">Back</a>


</body>
</html>

Может ли кто-нибудь помочь мне с этим? Похоже, я делаю все, как указано в руководстве, и ничего не получаю от этого.


person LewlSauce    schedule 13.10.2014    source источник


Ответы (1)


link_to_add_association должен быть расположен за пределами тега fields_for, все, что находится внутри него, будет реплицировано для каждой добавленной задачи, и обычно вам нужна только ссылка для добавления в конце, также ничего не отображается, потому что задача не создается, чтобы создать экземпляр, вы либо щелкните link_to_add_association или создайте их экземпляры при создании формы проектов, это можно сделать в действии контроллера проектов new, выполнив

#projects_controller.rb
def new
    @project = Project.new 
    @projet.tasks.build
end

Вы также можете создать здесь несколько задач при создании формы, выполнив некоторый цикл, например

3.times do
  @project.tasks.build
end
person Marcelo Risoli    schedule 13.10.2014
comment
Спасибо. Однако быстрый вопрос. вы сказали, что либо щелкаете ссылку, либо создаете их экземпляры. Как и где мне нажать на эту ссылку? Он никогда не отображается в форме с самого начала. Означает ли это, что создание экземпляров здесь единственный вариант? - person LewlSauce; 13.10.2014
comment
Ссылка на добавление не отображается, потому что она находится внутри тега fields_for. Поместив ее внутрь тега, она отображается один раз для каждого экземпляра модели задач, которая в данном случае равна нулю, поскольку задачи не были созданы, поэтому вы желательно поместить его вне тега fields_for, если только вы не хотите иметь ссылку добавления для каждой задачи - person Marcelo Risoli; 13.10.2014
comment
Хм. Теперь, когда я беру его за пределы тега fields_for, я получаю эту ошибку, которая возникает внутри партиала формы task_fields. неопределенный метод `new_record?' для nil:NilClass и ‹%= link_to_remove_association 'удалить задачу' выделен f %›. Любые идеи по этому поводу? Большое спасибо за вашу помощь до сих пор. - person LewlSauce; 13.10.2014
comment
Вы также поместили link_to_remove_association снаружи fields_for? Ссылка для удаления должна оставаться внутри тега fields_for, потому что она связана с задачей, которую вам нужно удалить, ассоциация добавления не - person Marcelo Risoli; 13.10.2014
comment
Неа. link_to_remove_association все еще находится в частичной форме, которая находится внутри fields_for. - person LewlSauce; 13.10.2014
comment
У вас есть //= require cocoon в вашем файле application.js? - person Marcelo Risoli; 13.10.2014
comment
Да, я знаю. Это одна из первых вещей, которые я добавил. - person LewlSauce; 13.10.2014
comment
Как насчет accepts_nested_attributes_for в модели проектов? - person Marcelo Risoli; 13.10.2014
comment
Ах, это сделало это для меня. Теперь мне просто нужно устранить неполадки, почему ссылка remove_association не удаляет задачу, когда я нажимаю на ссылку. Спасибо за всю твою помощь :) - person LewlSauce; 13.10.2014
comment
@LewlSauce: я сталкиваюсь с похожими проблемами и не знаю, почему это не отображается. У меня есть отношения has_may:through, и форма вообще не отображается. - person Qaiser Wali; 10.06.2015
comment
Для удаления полей нужно указать class="nested-fields", а не id="nested-fields" - person Ryan H.; 18.08.2015