2015-03-18 5 views
-1

У меня есть приложение с довольно сложной формой, которая использует 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 
+1

не сообщение об ошибке пришел с источником имя файла и номер строки? Они обычно делают ... – lurker

+0

Да, я отметил это в коде выше со стрелкой и запиской. Это находится под Self.perform в lib/project_updater.rb – NothingToSeeHere

+0

Ах, ладно, спасибо. :) – lurker

ответ

2

Прежде всего, я думаю, что есть опечатка в этой строке:

result = ProjectUpdater.perform(@project, update_params) 

Я не вижу update_params метод, поэтому я подумайте, что это должно быть project_params.

Проблема в том, что ProjectUpdater params.require(:project) возвращает хэш без внешнего: ключ проекта, поэтому в методе ProjectUpdater.perform избавиться от: ключ проекта:

milestones = params[:milestones] 
+0

А, мне нужно было добавить params в ProjectUpdater.perform (@project, project_params, params), чтобы получить вехи = params [: вехи] работать ... но это было! – NothingToSeeHere

Смежные вопросы