Question

Firstly this is the first time I have ever tried to use accepts_nested_attributes_for, so I am still learning and hopefully I have just missed something small.

So I have setup and follow an example for doing accepts_nested_attributes_for but I keep getting a ActiveModel::MassAssignmentSecurity::Error at /reports Can't mass-assign protected attributes: deployment

and I can't figure out why, any help would be grateful code is below:

Report Model:

class Report < ActiveRecord::Base
  attr_accessible :name, :weekending, :visable, :deployments_attributes
  has_many :deployments, dependent: :destroy
  accepts_nested_attributes_for :deployments, allow_destroy: true
end

Deployments Model:

class Deployment < ActiveRecord::Base
  attr_accessible :deployment_comments, :deployment_name, :environment, :report_id
  belongs_to :report
end

report/new.html.erb

<%= form_for (@report) do |f| %>

  <%= render 'shared/error_messages' %>
  <h4>Reprot Detials</h4>
  <%= f.label "Report Written By: " %>  <%= f.text_field :name %><br>
  <%= f.label "Weekending: " %>  <%= f.text_field :weekending %><br>
  <%= f.label "Visable: " %>  <%= f.text_field :visable %><br>

  <%= f.fields_for :deployment do |builder| %>
    <%= render 'reports/forms/deployment_fields', f: builder %>
  <% end %><br><br>


  <%= f.submit class: "btn btn-large btn-primary" %>

<% end %>

report/forms/_deployment_fields.html.erb

<h4>Deployments</h4>
  <%= f.label :deployment_name, "Name of Deployment:" %><br />
  <%= f.text_field :deployment_name %><br />
  <%= f.label :environment, "Environment of Deployment:" %><br />
  <%= f.text_field :environment %><br />
  <%= f.label :deployment_comments, "Deployment Comments:" %><br />
  <%= f.text_area :deployment_comments %><br />

Reports Controller:

class ReportsController < ApplicationController

  def index
    @reports = Report.paginate(:page   => params[:page],
                               :per_page => 20,
                               :order => 'Weekending desc')
  end

  def show
    @report = Report.find(params[:id])
  end

  def new
    @report = Report.new
  end

  def create
    @report = Report.new(params[:report])
    if @report.save
      redirect_to reports_url
    else
      render 'new'
    end
  end

DB Migrations:

timestamp_create_deployments.rb

class CreateDeployments < ActiveRecord::Migration
  def change
    create_table :deployments do |t|
      t.string :environment
      t.integer :report_id
      t.string :deployment_name
      t.string :deployment_comments

      t.timestamps
    end
    add_index :deployments, [:report_id]
  end
end

timestap_create_reports.rb

class CreateReports < ActiveRecord::Migration
  def change
    create_table :reports do |t|
      t.date :weekending, :null => false
      t.string :name, :null => false
      t.boolean :visable, :default => false, :null => false

      t.timestamps
    end
  end
end
Was it helpful?

Solution

So figured it out, once I changed

<%= f.fields_for :deployment do |builder| %>

to

<%= f.fields_for :deployments do |builder| %>

I found that the deployments fields didnt show, so then I added

@report.deployments.build

to my new method of my report controller!

I'll just need to figure out if I need to do anything to the update/edit method or not?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top