У меня есть приложение с довольно сложной формой, которая использует Ruby Objects в папке lib (мой первый раз с ruby-объектами). Я не могу понять, как создать multiple: task_ids в моей форме «Обновленные вложенные атрибуты», даже если параметры определены в моем пользовательском классе Ruby Object (это мой первый раз, используя это, и я учу, как его называть). Я получаю эту ошибку:undefined method `[] 'for nil: NilClass Ruby Object in lib Rails
undefined method `[]' for nil:NilClass
Что моя форма пытается сделать это создать задачи, стартер & стартера вех на основе Premade «шаблонные» задачи и основные этапы. Поэтому, когда пользователь создает проект, у них есть некоторые общие задачи, которые уже добавлены. Этот код относится непосредственно к этому предыдущий вопрос & ответ: Add Multiple Nested Attributes through checkboxes Rails 4 (maybe with multiple forms)
мой контроллер:
class ProjectsController < ApplicationController
def new_milestones
@project.milestones.build
@project.tasks.build
@milestones_templates = MilestoneTemplate.where(template_id: @project.template_id)
end
def update
respond_to do |format|
result = ProjectUpdater.perform(@project, update_params) == true
if result == true
format.html { redirect_to @project, notice: 'Project was successfully updated.' }
format.json { render :show, status: :ok, location: @project }
else
@project = result
format.html { render :edit }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
def project_params
params.require(:project).permit(:id, :name, :template_id, milestone_attributes:[{:names => []}, {:ids => []}, { :milestone_ids => []},:id, :name, :project_id, :milestone_template_id, :project_id, task_attributes: [{:names => []}, {:ids => []}, { :task_ids => []}, :id, :name, :milestone_id, :task_template_id, :project_id, :_destroy]])
end
end
Библиотека/project_updater.rb
class ProjectUpdater
def self.perform(project, params)
**milestones = params[:project][:milestones]** <--- this is the line where the error is
#Create and save each milestone
# You might be able to us nested attributes to save tasks.
if project.update_attributes(params[:project])
return true
else
return project
end
end
end
моя форма
<%= form_for @project do |f| %>
<% @milestones_templates.each_with_index do |milestone, index| %>
<br>
<%= f.fields_for :milestones, index: index do |fm| %>
<%= fm.hidden_field :name, value: milestone.name %>
<!-- Create a checkbox to add the milestone_id to the project -->
<%= fm.label milestone.name %>
<%= fm.check_box :milestone_template_id,{}, milestone.id %>
<br>
<% milestone.task_templates.each_with_index do |task, another_index| %>
<%= fm.fields_for :tasks, index: another_index do |ft| %>
<!-- Create a checkbox for each task in the milestone -->
<%= ft.label task.name %>
<%= ft.check_box :task_ids, {}, task.id %>
<% end %>
<% end %>
<br>
<% end %>
<% end %>
<br>
<%= f.submit %>
<% end %>
что такое подано:
{"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"do/NeMW4wvsh8PCOIYAvuDiH0DwKVr6v0Sm55gOuCHM/Fw5h9T0orRjrspcQpNSx5Vp2JOmtVf+3O18P2XB4vA==", "project"=>{"milestones"=>{"0"=>{"name"=>"Yellow Milestone 1", "milestone_template_id"=>"18", "tasks"=>{"0"=>{"task_ids"=>"1"}, "1"=>{"task_ids"=>"0"}, "2"=>{"task_ids"=>"0"}}}, "1"=>{"name"=>"Yellow Milestone 2", "milestone_template_id"=>"0", "tasks"=>{"0"=>{"task_ids"=>"0"}, "1"=>{"task_ids"=>"0"}, "2"=>{"task_ids"=>"0"}}}, "2"=>{"name"=>"Yellow Milestone 3", "milestone_template_id"=>"0", "tasks"=>{"0"=>{"task_ids"=>"0"}, "1"=>{"task_ids"=>"0"}, "2"=>{"task_ids"=>"0"}}}}}, "commit"=>"Update Project", "controller"=>"projects", "action"=>"update", "id"=>"155"}
конфигурации/application.rb
require File.expand_path('../boot', __FILE__)
require 'rails/all'
Bundler.require(*Rails.groups)
module Taskit
class Application < Rails::Application
config.autoload_paths += %W(#{config.root}/lib)
config.active_record.raise_in_transactional_callbacks = true
end
end
не сообщение об ошибке пришел с источником имя файла и номер строки? Они обычно делают ... – lurker
Да, я отметил это в коде выше со стрелкой и запиской. Это находится под Self.perform в lib/project_updater.rb – NothingToSeeHere
Ах, ладно, спасибо. :) – lurker