rails 4 mass assignment error with protected_attributes gem - ruby-on-rails

I'm trying to add a user profile sub module to a user module but having some problems.
Routes:
resources :users do
resources :userprofiles
end
userprofiles_controller.rb:
class UserprofilesController < ApplicationController
def edit
#user = current_user
#user.UserProfile ||= UserProfile.new
#userprofile = #user.UserProfile
end
def update
#user = current_user
#user.UserProfile ||= UserProfile.new
#userprofile = #user.UserProfile
if #userprofile.update_attributes(:userprofile => params[:userprofile])
redirect_to #user
flash[:notice] = "Changes saved."
else
render 'edit'
flash[:notice] = "Error."
end
end
end
user_profile.rb:
class UserProfile < ActiveRecord::Base
attr_accessible :first_name, :last_name, :summary
belongs_to :user
end
Error:
Can't mass-assign protected attributes for UserProfile: userprofile
Line:
if #userprofile.update_attributes(:userprofile => params[:userprofile])
EDIT
Form:
<%= form_for([#user, #userprofile], url: user_userprofile_path(#user, #userprofile)) do |form| %>
<%= form.label :first_name %>
<%= form.text_field :first_name %>
<%= form.label :last_name %>
<%= form.text_field :last_name %>
<%= form.label :summary %>
<%= form.text_area :summary %>
<%= form.submit "Update", class: "btn btn-block btn-primary" %>
<% end %>
Table:
create_table "user_profiles", force: true do |t|
t.string "last_name"
t.string "first_name"
t.text "summary"
t.integer "user_id", null: false
t.datetime "created_at"
t.datetime "updated_at"
end

You just want
#userprofile.update_attributes(params[:userprofile])
That's a hash with keys :first_name, :last_name, and :summary, which are allowed attributes. When you try to update :userprofile => params[:userprofile], the model checks to see if the key :userprofile is allowed - and it isn't.

I also had this problem. The issue is that you still have attr_accessible in your model controller. Since you don't need them anymore with Rails 4 remove them, add your strong parameters to the controller, and you'll be able to mass-assign without issue.

Related

Ruby on Rails My Database always makes the foreign keys nil why?

This is my schema for Table Listing
create_table "listings", force: :cascade do |t|
t.string "title"
t.text "description"
t.string "city"
t.string "state"
t.string "zipcode"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "category_id"
t.integer "subcategory_id"
end
Here is my Model:
class Listing < ApplicationRecord
belongs_to :category, required: false
belongs_to :subcategory, required: false
end
Every time I enter a data via form, My data are recorded in Database with their assigned values but my foreign keys (category_id, subcategory_id) are always nil? why?
Here is my form: new.html.erb
<%= form_for #listing do |f| %>
<%= f.label :title %>
<%= f.text_field :title %>
<%= f.label :description %>
<%= f.text_area :description %>
<p> <%= f.label :category_id %>
<%= f.select :category_id, Category.all.map {|f| [f.name,f.id]} %></p>
<p> <%= f.label :subcategory_id %>
<%= f.select :subcategory_id, Subcategory.all.map {|f| [f.name,f.id]} %></p>
<%= f.label :city %>
<%= f.text_field :city %>
<%= f.label :state %>
<%= f.text_field :state %>
<%= f.label :zipcode %>
<%= f.text_field :zipcode, class: "zip-width", maxlength: "5" %>
<%= f.submit class:"create-button" %>
<% end %>
Here is my controller:
class CategoriesController < ApplicationController
def index
#categories = Category.all
#societal = #categories[0] #id 1 bhayekoharu
#onsale = #categories[1]
#housing = #categories[2]
#works = #categories[3]
#services = #categories[4]
#personal = #categories[5]
end
def show
#listings = Listing.where(category_id: params[:id])
end
My database shows following record:
<Listing id:6, title: "apartment on rent", description: "rent 5 bed room\r\n800 per month\r\nno pets", city: "aust
in", state: "tx", zipcode: "78749", created_at: "2018-06-21 00:02:40", updated_at: "2018-06-21 00:02:40
", category_id: nil, subcategory_id: nil>,
Here is my full controller for Listing:
class ListingsController < ApplicationController
def new
#listing = Listing.new
end
def create # we have to hold paramaters.
#listing = Listing.new(listing_params)
if #listing.save
redirect_to root_path
else
# redisplay the form if validation failed
render action: 'new'
end
end
def show
#listing = Listing.find(params[:id])
end
private
def listing_params
params.require(:listing).permit(:title, :description, :city, :state, :zipcode,:category, :subcategory)
end
end
One common mistake you might've done is not allowing those ids in strong params. Check the strong params in your controller where the listing create action is residing.
You should permit category_id and subcategory_id in strong params.
Example:
def listing_params
params.require(:listing).permit(:category_id, :subcategory_id)
end
If you're sure that you're allowing both the parameters, Please share your Rails log.
Don't forget to permit your Params at your controller. Permit both at param.require and It will work.

collection_select content is not showing

I'm currently trying to display the organization which a content identifies themselves with via a collection_select form.
The issue is that after creating a new contact and choosing an organization. The organization doesn't display.
I have tried searching the web for an answer so far but nothing has helped. I have also tried everything that I can think of is the issue with my code.
Here are my models:
class Contact < ApplicationRecord
has_many :contact_orgs
has_many :organizations, through: :contact_orgs
accepts_nested_attributes_for :organizations
end
class Organization < ApplicationRecord
has_many :contact_orgs
has_many :contacts, through: :contact_orgs
end
class ContactOrg < ApplicationRecord
belongs_to :contact
belongs_to :organization
accepts_nested_attributes_for :organization
end
Here is my schema.rb:
create_table "contact_orgs", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "contact_id"
t.integer "organization_id"
t.index ["contact_id"], name: "index_contact_orgs_on_contact_id"
t.index ["organization_id"], name: "index_contact_orgs_on_organization_id"
end
create_table "contacts", force: :cascade do |t|
t.string "first_name"
t.string "last_name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "organizations", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "industry"
end
Here is my contact_controller.rb:
private
def contact_params
params.require(:contact).permit(:first_name, :last_name,
organizations_attributes: [:name, :industry])
end
def new
#contact = Contact.new
end
def show
#contact = Contact.find(params[:id])
end
def create
#contact = Contact.new(contact_params)
if #contact.save
redirect_to #contact
else
render 'new'
end
end
Here is my contact/new.html.erb:
<%= form_with scope: :contact, url: contact_path, local: true do |form| %>
<p>
<%= form.label :first_name %><br>
<%= form.text_field :first_name %>
</p>
<p>
<%= form.label :last_name %><br>
<%= form.text_field :last_name %>
</p>
<p>
<%= form.label :organization_id, "Organization:" %><br>
<%= form.collection_select :organization_id, Organization.order(:name), :id, :name, {}, {multiple: true} %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>
Here is my contact/show.html.erb:
<p>
<strong>First name:</strong>
<%= #contact.first_name %>
</p>
<p>
<strong>Last Name:</strong>
<%= #contact.last_name %>
</p>
<hr>
<p>
<strong>Organizations:</strong>
<ul>
<% #contact.organizations.each do |organization| %>
<li><%= organization.name %></li>
<% end %>
</ul>
</p>
Here is what my Rails Server is saying when I refresh my localhost:3000/contact/2 page.
Here is what is in my Rails Console:
2.4.1 :001 > Contact.find(2).organizations
Contact Load (0.2ms) SELECT "contacts".* FROM "contacts" WHERE "contacts"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]]
Organization Load (0.2ms) SELECT "organizations".* FROM "organizations" INNER JOIN "contact_orgs" ON "organizations"."id" = "contact_orgs"."organization_id" WHERE "contact_orgs"."contact_id" = ? LIMIT ? [["contact_id", 2], ["LIMIT", 11]]=> #<ActiveRecord::Associations::CollectionProxy []>
Here is my routes.rb file:
Rails.application.routes.draw do
get 'welcome/index'
resources :contacts, :organizations
root 'welcome#index'
end
Thank you ahead of time :)
Edit:
Added Contacts#Show method and Contact.find(2).organization via Rails c command.
Added routes.rb
Since you’re using a joins table (ContactOrg) you really are trying to create a new ContactOrg record when you create a Contact, not assign it to Organization, which is how your code reads.
EDIT
While my first statement above still has a (little) bit of merit (you are in fact creating a joins record), you can definitely let rails help you out and you were pretty close in your original answer. Here's code only where there are updates, I tried to highlight changes.
app/models/contact.rb
class Contact < ApplicationRecord
has_many :contact_orgs
has_many :organizations, through: :contact_orgs
accepts_nested_attributes_for :organizations # you were correct here
end
app/views/contact/new.html.erb
<%= form_with model: :contact, local: true do |form| %>
# use :model here so you can ultimately use this form for both new and edit.
# The model method will infer the correct path
... contact fields here as you have them ...
<p>
<%= form.collection_select :organization_ids, Organization.order(:name), :id, :name, {}, {multiple: true} %>
# the attribute for organization_id should be plural because you're accepting multiple
<p>
<p>
<%= form.submit %>
</p>
<% end %>
app/controllers/contacts_controller.rb
class ContactsController < ApplicationController
... new, show, and create as you have them ...
private # private methods should go after all public methods
def contact_params
params.require(:contact).permit(:first_name, :last_name, organization_ids: [])
# again, the attribute you're passing in is called organization_ids, and you give it an empty array
end
end
Your contract_controller do not initialize #contact used in show.html.erb because there isn't any show method does it that.
Try to add in contact_controller
def show
#contact = Contact.find(param[:id])
end
PS: when you call show method be sure to pass to it a contact.id
I hope this help you.
There are two problems:
You are not able to save the organizations to your contract.
You can check in your rails c by Contact.find(2).organizations.
We never use to write new and create in the private method.
Your private method should not contain any of the curd.
In your app/controllers/contacts_controller.rb
private
def contact_params
params.require(:contact).permit(
:first_name,
:last_name,
organizations_attributes: [
:name,
:industry
]
)
end
In your app/views/contact/new.html.erb
<%= form_with scope: :contact, url: contact_index_path, local: true do |form| %>
<p>
<%= form.label :first_name %><br>
<%= form.text_field :first_name %>
</p>
<p>
<%= form.label :last_name %><br>
<%= form.text_field :last_name %>
</p>
<p>
<%= form.fields_for :organizations do |o| %>
<%= o.label :organization %><br>
<%= o.collection_select(:organization_id, Organization.all,
:id, :org_name,
{:prompt => 'Please select the organization'}) %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>

Can't save my data into sqlite database

I am trying to implement a Parking Permit application page using ROR. I couldn't get my data saved into the database. The permit database is associated with the user also. The program won't save the data and execute the else statement. There is no error generated, i think i have missed something but i don't know the exact problem. Any help is appreciated!
Permit_controller.rb
class PermitsController < ApplicationController
before_action :set_permit, only: [:show, :destroy]
def index
#permits = Permit.all
end
def new
#permits = Permit.new
end
def create
#permits = Permit.new(permit_params)
if #permits.save
redirect_to root_path
else
redirect_to contact_path
end
end
def destroy
end
def show
#permits = Permit.find(params[:id])
end
private
# Use callbacks to share common setup or constraints between actions.
def set_permit
#permits = Permit.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def permit_params
params.require(:permit).permit(:vehicle_type, :name, :studentid, :department, :carplate,:permitstart, :permitend)
end
end
Permit.rb
class Permit < ApplicationRecord
belongs_to :user
end
Create_permit.rb
class CreatePermits < ActiveRecord::Migration[5.0]
def change
create_table :permits do |t|
t.string :vehicle_type
t.string :name
t.string :studentid
t.string :department
t.string :carplate
t.date :permitstart
t.date :permitend
t.references :user, foreign_key: true
t.timestamps
end
add_foreign_key :permits, :user
add_index :permits, [:user_id, :created_at]
end
end
User.rb
class User < ApplicationRecord
has_secure_password
has_many :permits
end
#book pg 264 Validation
permit/new.html.erb
<% provide(:title, 'New Permit') %>
<h1>Permit Application</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_for(#permits) do |f| %>
<%= f.label :"Vehicle" %>
<%= f.text_field :vehicle_type, class: 'form-control' %>
<%= f.label :"License Plate" %>
<%= f.text_field :carplate, class: 'form-control' %>
<%= f.label :"Student ID" %>
<%= f.text_field :studentid, class: 'form-control' %>
<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>
<%= f.label :"Department of applicant" %>
<%= f.text_field :department, class: 'form-control' %>
<%= f.label :permit_start %>
<%= f.date_select :permitstart, class: 'form-control' %>
<%= f.label :permit_end %>
<%= f.date_select :permitend, class: 'form-control' %>
<%= f.submit "Submit", class: "btn btn-primary" %>
<% end %>
</div>
</div>
schema.rb
ActiveRecord::Schema.define(version: 20160921071908) do
create_table "permits", force: :cascade do |t|
t.string "vehicle_type"
t.string "name"
t.string "studentid"
t.string "department"
t.string "carplate"
t.date "permitstart"
t.date "permitend"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["user_id"], name: "index_permits_on_user_id"
end
create_table "users", force: :cascade do |t|
t.string "name"
t.string "email"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "password_digest"
t.integer "user_type"
end
end
check with this #permits.save!.
it shows the exact error.
module ApplicationHelper
#for current user to use through out the app
def current_user
#current_user ||= session[:current_user_id] && User.find_by_id(session[:current_user_id]) # Use find_by_id to get nil instead of an error if user doesn't exist
end
end
and
def create
#permits = Permit.new(permit_params)
#permits.user = current_user
if #permits.save
redirect_to root_path
else
redirect_to contact_path
end
end
test it
Or you can just say that a permit has a single user and avoid the confusion.
#models/permit.rb
class Permit < ApplicationRecord
has_one :user
end
#controllers/permit_controller.rb
def create
#user = User.find(session[:user_id]) #use your session variable
#permits = Permit.new(permit_params)
if #permits.save
#user.permits << #permits
redirect_to root_path
else
redirect_to contact_path
end
end
It will save permits for the logged in user.

undefined local variable or method error-attempting to link a comment to a blog

I am working on a Rails 4 project and I currently have a comment section that is tied to a group section-the group is almost like a blog. I need the group id number to be linked to a new comment. I do not want the user to select the group id but instead have it automatically show up. I currently have this in my comment form, my problem is coming in form the last form-group with the Group Id:
<div class="form-group">
<%= form.label :author %>
<%= form.text_field :author, autofocus: true, class: "form-control",
placeholder: "Author's Name" %>
</div>
<div class="form-group">
<%= form.label :comment %>
<%= form.text_field :comment, class: "form-control", placeholder: "Write
your hearts content" %>
</div>
<div class="hide">
<%= form.number_field :user_id, value: current_user.id %>
</div>
<div class="form-group">
<%= form.number_field :group_id, value: group.id %>
</div>
What I want to do is have something like the :user_id, value: current_user.id work with each group. The user id line works fine and I have no problems with it. It is only that group line that I receive the following error: undefined local variable or method `group' for #<#:0x007f873a161fc0>
My schema looks like the following:
create_table "comments", force: :cascade do |t|
t.string "author"
t.text "comment"
t.integer "user_id"
t.integer "group_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "groups", force: :cascade do |t|
t.string "topic"
t.integer "user_id"
t.text "description"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.float "latitude"
t.float "longitude"
t.string "address"
t.string "city"
t.string "state"
end
Finally, my comments controller looks like the following:
class CommentsController < ApplicationController
def new
#comment = Comment.new
end
def create
#comment = Comment.new(comment_params)
if #comment.save
redirect_to #group
else
render 'new'
end
end
def edit
end
def update
end
private
def comment_params
params.require(:comment).permit(:author, :comment, :user_id, :group_id)
end
end
Please let me know if any more information is needed. Thank you for the help!
Here are the models for groups and Comments:
Comment:
class Comment < ActiveRecord::Base
belongs_to :group
end
Group:
class Group < ActiveRecord::Base
has_many :collections
has_many :comments
has_many :users, :through => :collections
validates :topic, presence: true
validates :description, presence: true, length: { minimum: 10 }
geocoded_by :address
after_validation :geocode
end
Without specifying the :value option in a form_for method, Rails automatically infers the value from the column name, so leaving it out like below should work for your specific use case, otherwise instead of referring to group, use #comment.group_id:
<div class="form-group">
<%= form.label :author %>
<%= form.text_field :author, autofocus: true, class: "form-control",
placeholder: "Author's Name" %>
</div>
<div class="form-group">
<%= form.label :comment %>
<%= form.text_field :comment, class: "form-control", placeholder: "Write
your hearts content" %>
</div>
<div class="hide">
<%= form.number_field :user_id, value: current_user.id %>
</div>
<div class="form-group">
<%= form.number_field :group_id %>
</div>
However, I'm not totally sure whether you're approaching a few things right.
Some immediate changes, I'd probably propose would be:
Use nested routes:
# routes.rb
resources :groups do
resources :comments
end
In your CommentsController, you could now fetch the group_id from the route:
def create
group = Group.find(params[:group_id])
#comment = current_user.comments.new(comment_params)
#comment.group = group
if #comment.save
redirect_to group
else
render 'new'
end
end
private
def comment_params
params.require(:comment).permit(:author, :comment)
end
This way, in your view, you could easily do:
<div class="form-group">
<%= form.label :author %>
<%= form.text_field :author, autofocus: true, class: "form-control",
placeholder: "Author's Name" %>
</div>
<div class="form-group">
<%= form.label :comment %>
<%= form.text_field :comment, class: "form-control", placeholder: "Write
your hearts content" %>
</div>
Note: :user_id and :group_id have been removed from the form fields because those mappings are now done on the controller level.
Read more about nested routes and nested resources here
UPDATE
For a new comment, the group_id would be nil because it has not been associated to it yet(one of the benefits of nested resources), however if you know beforehand what the group might be, you might want to try:
#comment = group.comments.build
and instead use the value of this #comment.
When you create a comment do you know which group it belongs to:?
I think the issue is with this line
<%= form.number_field :group_id, value: group.id %>
So you are assigning an ID but your group is not initialized. Can you do something like this inside new method
def new
#group = Group.find(...) # load a group here and assign below
#comment = Comment.new(group: #group)
end
You could also refactor so when you create a comment you go to tested route like /groups/ID/comments and then the group ID will be inside params
Hope it helps
if you know which group a comment should belong to then you could do something like this
class CommentsController < ApplicationController
def new
#group = Group.find(...)
#comment = Comment.new
end
def create
comment = Comment.create(comments_params)
if comment.save
redirect_to comments_path
else
redirect_to :new
end
end
private
def comments_params
params.require(:comment).permit(:body, :group_id)
end
end
and inside your form you could have your comment linked to that group
<%= f.number_field :group_id, value: #group.id %>

Unpermitted parameters: user error when passing user params using nested attributes

I have a form that collects company information as well as the first user (the company admin). When I submit the form, the company attributes are saved to the db. However, the user attributes are not. I get the error Unpermitted parameters: user. I can't figure out why the user is not being created and saved.
I have:
class CompaniesController < ApplicationController
def new
#company = Company.new
#plans = Plan.all
end
def create
#company = Company.new(company_params)
#user = User.new
#user.role = "admin"
#user.save
if #company.save
redirect_to #company, notice: 'Company was successfully created.'
else
render action: 'new'
end
end
private
# Never trust parameters from the scary internet, only allow the white list through.
def company_params
params.require(:company).permit(:name, :plan_id, users_attributes: [:id, :company_id, :email, :password, :password_confirmation, :first_name, :last_name, :role, :rate])
end
end
and
class UsersController < ApplicationController
# include UsersHelper
def index
#users = User.all
end
def new
#user = User.new
end
def create
#user = User.new(user_params)
#user.save
flash.notice = "User '#{#user.first_name} #{#user.last_name}' was successfully created."
redirect_to user_path(#user)
end
def show
#user = User.find(params[:id])
end
def edit
#user = User.find(params[:id])
end
def update
#user = User.find(params[:id])
#user.update(user_params)
flash.notice = "User '#{#user.first_name}' has been updated."
redirect_to user_path(#user)
end
def destroy
end
private
# Never trust parameters from the scary internet, only allow the white list through.
def user_params
params.require(:user).permit(:email, :password, :password_confirmation, :first_name, :last_name, :role, :rate)
end
end
and
class Company < ActiveRecord::Base
has_many :users
belongs_to :plan
accepts_nested_attributes_for :users, :allow_destroy => true
end
and
class User < ActiveRecord::Base
authenticates_with_sorcery!
validates_confirmation_of :password, message: "should match confirmation", if: :password
has_many :jobs
belongs_to :company
end
and
<%= form_for(#company) do |f| %>
<% if #company.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(#company.errors.count, "error") %> prohibited this company from being saved:</h2>
<ul>
<% #company.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name, :id => "name" %>
</div>
<div class="field">
<%= collection_select( :company, :plan_id, #plans, :id, :name ) %>
</div>
<%= f.fields_for :user do |user| %>
<div class="field">
<%= user.label :email %><br>
<%= user.text_field :email %>
</div>
<div class="field">
<%= user.label :password %><br>
<%= user.password_field :password %>
</div>
<div class="field">
<%= user.label :password_confirmation %><br>
<%= user.password_field :password_confirmation %>
</div>
<div class="field">
<%= user.label :first_name %><br>
<%= user.text_field :first_name %>
</div>
<div class="field">
<%= user.label :last_name %><br>
<%= user.text_field :last_name %>
</div>
<div class="field">
<%= user.label :role %><br>
<%= user.text_field :role %>
</div>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
and
ActiveRecord::Schema.define(version: 20140421235514) do
create_table "companies", force: true do |t|
t.string "name"
t.string "stripe_token"
t.integer "plan_id"
t.integer "user_id", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "companies", ["plan_id"], name: "index_companies_on_plan_id"
add_index "companies", ["user_id"], name: "index_companies_on_user_id"
create_table "plans", force: true do |t|
t.string "stripe_id"
t.string "name"
t.integer "amount"
t.string "interval"
t.string "currency"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "users", force: true do |t|
t.string "email", null: false
t.string "crypted_password", null: false
t.string "salt", null: false
t.datetime "created_at"
t.datetime "updated_at"
t.string "reset_password_token"
t.datetime "reset_password_token_expires_at"
t.datetime "reset_password_email_sent_at"
t.string "first_name"
t.string "last_name"
t.string "role"
t.integer "rate"
t.integer "company_id"
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token"
end
Company and User are associated with 1-M Relationship , i.e., Company has_many :users
In that case, in your view for Company, the nested form should be
<%= f.fields_for :users do |user| %> ## Notice users in plural
and NOT
<%= f.fields_for :user do |user| %>
Refer to the Nested Attributes Examples for One to Many
Currently, fields_for is setup incorrectly with singular :user so in params hash you got the key as :user and again a warning Unpermitted parameters: user because of which the user attributes were not stored in database.
Now, as you have setup accepts_nested_attributes_for in Company model. Controller is expecting user attributes in key users_attributes within params hash.
Changing the fields_for with plural :users argument would result in creation of users_attributes key in params hash upon form submission.
UPDATE
Company has many users, its 1-M relationship
Only users table should have foreign key as company_id.
You need to remove user_id from companies table.
Also, update the CompaniesController#new action as below:
def new
#company = Company.new
#users = #company.users.build
#plans = Plan.all
end
Strong params permitting looks fine to me but i think the issue is in the nested form, you used wrong relation name user while its users which generates a params hash titled with user which is not permitted, instead you should do:
<%= f.fields_for :users do |user| %>
#rest of the form elements
<% end %>

Resources