What causes foreign key = nil? - ruby-on-rails

Generator has_many results
Result belongs_to generator
When i run rails console : Result.find(1) , the generator_id= nil. Why is this so ??? When i'm creating the data , the routes are like this :
localhost:3000/generator/1/results/new
It has got no error with the following code. BUt how come when i have this in my Generator/index.html
<% generator.results.each do |result| %>
<td><%= result.ncbi_ref_seq %></td>
<td><%= result.genome_sample %></td>
<td><%= result.binding_times %></td>
<%end%>
they're empty. Whereas the #generators.each do |generator| gives me the values of the generator. In other words, the result's value belonging to this generator is empty but the generator values are shown. What i want is to have all generators and their result value to be shown. Can some1 help me ?
Generator.model
class Generator < ActiveRecord::Base
has_many :results , :dependent => :destroy
attr_accessible :choice, :primer_length, :random_primer_generated, :genome_sample, :generator_id
GeneratorController.rb
def index
#generators = Generator.all
end
def create
#generator = Generator.new(generator_params)
#generator.choice = params[:choice]
if params[:choice] == 'Randomly'
#generator.random_generate(generator_params)
elsif params[:choice] == 'No_of_ATGC'
#generator.no_ATGC(params[:no_A],params[:no_T],params[:no_G],params[:no_C])
elsif params[:choice] == 'Seating'
#generator.seating(params[:user_seq])
end
#generator.result_choice=params[:result_choice]
respond_to do |format|
if #generator.save
if #generator.result_choice == 'Yes'
format.html { redirect_to(new_generator_result_path(#generator)) }
else
format.html { redirect_to #generator, notice: 'Result was successfully created.' }
format.json { render action: 'show', status: :created, location: #generator }
end
else
format.html { render action: 'new' }
format.json { render json: #generator.errors, status: :unprocessable_entity }
end
end
end
Result Model
class Result < ActiveRecord::Base
attr_accessible :ncbi_ref_seq,:genome_seq, :genome_sample
belongs_to :generator, foreign_key: "generator_id"
ResultController
def index
#results = Result.all
end
def create
#result = Result.new(result_params)
#result.generate_result(result_params)
respond_to do |format|
if #result.save
format.html { redirect_to #result, notice: 'Result was successfully created.' }
format.json { render action: 'show', status: :created, location: #result }
else
format.html { render action: 'new' }
format.json { render json: #result.errors, status: :unprocessable_entity }
end
end
end
schema.rb
create_table "generators", force: true do |t|
t.integer "primer_length"
t.integer "no_A"
t.integer "no_T"
t.integer "no_G"
t.integer "no_C"
t.string "choice"
t.string "random_primer_generated"
t.string "user_seq"
t.string "c_primer"
t.string "result_choice"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "results", force: true do |t|
t.integer "generator_id"
t.string "ncbi_ref_seq"
t.string "genome_seq"
t.string "genome_sample"
t.integer "binding_times"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "results", ["generator_id"], name: "index_results_on_generator_id"
create_table "results_{:column_options=>{:null=>true}}", id: false, force: true do |t|
t.integer "result_id", null: false
t.integer "{:column_options=>{:null=>true}}_id", null: false
t.integer "generator_id"
t.string "ncbi_ref_seq"
t.string "genome_seq"
t.string "genome_sample"
t.integer "binding_times"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "results_{:column_options=>{:null=>true}}", ["generator_id"], name: "index_results_{:column_options=>{:null=>true}}_on_generator_id"

Related

Using Rails how to find booked classes from a user in a given period of time

I have an app where I post school classes and users can book classes. Now I have added stripe payments, with a monthly subscription. I would like to know how to show users how many classes they have booked since their monthly payment started.
I have tried this:
<%= #mylessons_lessons.count %>
But this only gives me the total lessons (classes) someone has booked since the beginning of time.
How could I find the booked lessons from each user depending on the date their subscription started and that only takes into account those of the last monthly subscription.
This is my lessons controller:
class LessonsController < ApplicationController
before_action :set_lesson, only: [:show, :edit, :update, :destroy, :mylessons]
before_action :authenticate_user!
# GET /lessons
# GET /lessons.json
def index
#lessons = Lesson.order(created_at: :asc)
end
# GET /lessons/1
# GET /lessons/1.json
def show
end
# GET /lessons/new
def new
#lesson = current_user.lessons.build
redirect_to root_path, warning: "You are not authorized" unless #current_user.admin?
end
# GET /lessons/1/edit
def edit
redirect_to root_path, warning: "You are not authorized" unless #current_user.admin?
end
# POST /lessons
# POST /lessons.json
def create
#lesson = current_user.lessons.build(lesson_params)
respond_to do |format|
if #lesson.save
format.html { redirect_to #lesson, notice: 'lesson was successfully created.' }
format.json { render :show, status: :created, location: #lesson }
else
format.html { render :new }
format.json { render json: #lesson.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /lessons/1
# PATCH/PUT /lessons/1.json
def update
redirect_to root_path, warning: "You are not authorized" unless #current_user.admin?
respond_to do |format|
if #lesson.update(lesson_params)
format.html { redirect_to #lesson, notice: 'lesson was successfully updated.' }
format.json { render :show, status: :ok, location: #lesson }
else
format.html { render :edit }
format.json { render json: #lesson.errors, status: :unprocessable_entity }
end
end
end
# DELETE /lessons/1
# DELETE /lessons/1.json
def destroy
redirect_to root_path, warning: "You are not authorized" unless #current_user.admin?
#lesson.destroy
respond_to do |format|
format.html { redirect_to lessons_url, notice: 'lesson was successfully destroyed.' }
format.json { head :no_content }
end
end
# Add and remove lessons to mylessons
# for current_user
def mylessons
type = params[:type]
if type == "add"
current_user.mylessons_additions << #lesson
redirect_to root_path, notice: "#{#lesson.title} ha sido aƱadida a tus clases"
elsif type == "remove"
current_user.mylessons_additions.delete(#lesson)
redirect_to root_path, notice: "#{#lesson.title} ha sido eliminada de tus clases"
else
# Type missing, nothing happens
redirect_to lesson_path(#lesson), notice: "Parece que no ha sucedido nada, prueba otra vez!"
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_lesson
#lesson = Lesson.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def lesson_params
params.require(:lesson).permit(:title, :description, :teacher, :thumbnail, :user_id, :date, :datetime, :lessonlink, :giphyimage, :game, :externalmaterial, :lessonage )
end
end
and my mylessons controller:
class MylessonsController < ApplicationController
before_action :set_lesson, only: [:show, :edit, :update, :destroy, :mylessons, :lessons]
before_action :authenticate_user!
def index
#mylessons_lessons = current_user.mylessons_additions
#lessons = Lesson.order(created_at: :asc)
end
end
and the schema from my db payments:
create_table "pay_charges", force: :cascade do |t|
t.bigint "owner_id"
t.string "processor", null: false
t.string "processor_id", null: false
t.integer "amount", null: false
t.integer "amount_refunded"
t.string "card_type"
t.string "card_last4"
t.string "card_exp_month"
t.string "card_exp_year"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "owner_type"
t.index ["owner_id"], name: "index_pay_charges_on_owner_id"
end
create_table "pay_subscriptions", id: :serial, force: :cascade do |t|
t.integer "owner_id"
t.string "name", null: false
t.string "processor", null: false
t.string "processor_id", null: false
t.string "processor_plan", null: false
t.integer "quantity", default: 1, null: false
t.datetime "trial_ends_at"
t.datetime "ends_at"
t.datetime "created_at"
t.datetime "updated_at"
t.string "status"
t.string "owner_type"
end
create_table "plans", force: :cascade do |t|
t.string "name"
t.integer "amount", default: 0, null: false
t.string "interval"
t.jsonb "details", default: {}, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "trial_period_days", default: 0
end
Conceptually the steps are:
check when user (paied) subscribed
get all classes from the date of subscription
show classes or number of classes in your view
You could use a scope in the model you want to check for start date of subscription, something like
scope :classes_after_subscription, ->(date) { where("created_at >= ?", date) }
and call it in your controller or in a decorator to use it in a view
classes_after_subscription("pass_user_sub_date_HERE").size

New strong parameter not being saved in database

I added a new column named "version" to a table in Rails using a migration and manually added the corresponding parameter to the strong parameters permitted in the corresponding controller:
def endpoint_params
params.require(:endpoint).permit(:hostname, :username, :password, :connection_string, :entity_id, :created_at,
:updated_at, :endpoint_type_id, :endpoint_app_id, :environment_id, :created_by,
:updated_by, :version)
end
However, when I try to set that new parameter in the update action and save it to the database, it doesn't get saved at all. The code that I'm using is:
def update
begin
#environment = Environment.find(params[:env])
version_no = (EndpointsFile.where("environment_id = ?", #environment.id).maximum('version') || 0) + 1
#endpoint.updated_by = current_user.id
#endpoint.version = version_no
respond_to do |format|
if #endpoint.update(endpoint_params)
#endpoints = Endpoint.where("environment_id = ? and id <> ?", #environment.id, #endpoint.id)
EndpointsFile.create!(version: version_no, date: Time.now, environment_id: #environment.id)
#endpoints.each do |e|
e.version = version_no
e.save
puts "e.version: #{e.version}" **=> HERE IT PRINTS e.version: and the field is null in the database**
end
format.html { redirect_to env_endpoints_path(env: #environment.id), notice: t('.notice') }
format.json { render :show, status: :ok, location: #endpoint }
else
format.html { render :edit }
format.json { render json: #endpoint.errors, status: :unprocessable_entity }
end
end
rescue => exception
logger.error { "endpoints_controller.update -> Ocorreu um erro ao atualizar o endpoint: #{exception.message}" }
respond_to do |format|
format.html { redirect_to env_endpoints_path(env: #environment.id), alert: "Ocorreu um erro ao atualizar o endpoint: #{exception.message}" and return }
format.json { render json: #endpoint.errors, status: :unprocessable_entity }
end
end
end
This is the Endpoint model:
class Endpoint < ApplicationRecord
belongs_to :entity
belongs_to :environment
belongs_to :endpoint_app
belongs_to :endpoint_type
has_many :configs_histories
has_paper_trail
end
The table in DB is:
create_table "endpoints", force: :cascade do |t|
t.string "hostname"
t.string "username"
t.string "password"
t.string "connection_string"
t.integer "entity_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "endpoint_type_id"
t.integer "endpoint_app_id"
t.integer "environment_id"
t.integer "created_by"
t.integer "updated_by"
t.integer "version"
t.index ["endpoint_app_id"], name: "index_endpoints_on_endpoint_app_id"
t.index ["endpoint_type_id"], name: "index_endpoints_on_endpoint_type_id"
t.index ["entity_id"], name: "index_endpoints_on_entity_id"
t.index ["environment_id"], name: "index_endpoints_on_environment_id"
end
What am I doing wrong? Why doesn't the command e.save work?
Finally found the solution.
version is a reserved keyword so it can't be used as a column name.
check link: http://reservedwords.herokuapp.com/words?page=9
Since you are calculating version_no inside update, you don't have to pass it in controller or permit in strong parameters, just do the following
#endpoint.update(endpoint_params.merge(version: version_no))

rails 4 undefined method 'name' for nil:NilClass - category

I want to display an image according to a category name. My images are in the app/assets/images
My tutos will have categories that I have created in the console.
Now, I have this error (again...) undefined method 'name' for nil:NilClass.
Thanks again for your precious help !
here is my form:
= simple_form_for #tuto do |f|
- if #tuto.errors.any?
#error_explanation
h2 = "#{pluralize(#tuto.errors.count, "error")} prohibited this tuto from being saved:"
ul
- #tuto.errors.full_messages.each do |message|
li = message
= f.hidden_field :user_id, value: current_user.id
= f.input :title
= f.collection_select :category_id, Category.all, :id, :name, {prompt: "Choose a category"}
= f.input :content, as: :text, input_html: { rows: "15" }
= f.button :submit, "Save"
the tutos_controller.rb
class TutosController < ApplicationController
before_action :authenticate_user!
before_action :set_tuto, only: [:show, :edit, :update, :destroy, :upvote]
def index
#tutos = Tuto.all.includes(:user, :category)
end
def show
#tuto = Tuto.find(params[:id])
#user = User.all
end
def new
#tuto = Tuto.new
end
def edit
end
def create
#tuto = Tuto.new(tuto_params)
#tuto.user_id = current_user.id
respond_to do |format|
if #tuto.save
flash[:success] = "Test"
format.html { redirect_to #tuto, notice: 'Tuto was successfully created.' }
format.json { render :show, status: :created, location: #tuto }
else
format.html { render :new }
format.json { render json: #tuto.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if #tuto.update(tuto_params)
format.html { redirect_to #tuto, notice: 'Tuto was successfully updated.' }
format.json { render :show, status: :ok, location: #tuto }
else
format.html { render :edit }
format.json { render json: #tuto.errors, status: :unprocessable_entity }
end
end
end
def destroy
#tuto.destroy
respond_to do |format|
format.html { redirect_to tutos_url, notice: 'Tuto was successfully destroyed.' }
format.json { head :no_content }
end
end
def upvote
#tuto.upvote_by current_user
redirect_to :back
end
private
# def get_user
# #user = User.find(#tuto.user_id)
# end
def set_tuto
#tuto = Tuto.find(params[:id])
end
def tuto_params
params.require(:tuto).permit(:title, :content, :id, :user_id, :category_id)
end
end
the categories_controller.rb
class CategoriesController < ApplicationController
private
def categories_params
params.require(:categories).permit(:name, :description, :id)
end
end
my views/tutos/index.html.slim
.container
.row
.col-xs-12.col-sm-12
h1.text-gray Tutorials
br
-if user_signed_in?
= link_to "Create a tuto", new_tuto_path, class:"btn btn-success"
#tutos.transitions-enabled
- #tutos.each do |tuto|
.box.panel-default
-if tuto.category.name == "Ruby"
=image_tag("select/ruby.png")
-elsif tuto.category.name == "Rails 4"
=image_tag("selec/rails4.png")
-elsif tuto.category.name == "Rails 5"
=image_tag("selec/rails5.png")
-elsif tuto.category.name == "Heroku"
=image_tag("select/heroku.png")
-elsif tuto.category.name == "AWS"
=image_tag("select/aws.png")
= link_to tuto.title, tuto_path(tuto)
h6 Created by:
= tuto.user.full_name
hr
my schema.rb
ActiveRecord::Schema.define(version: 20160920133801) do
create_table "categories", force: :cascade do |t|
t.string "name"
t.text "description"
t.string "image"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "tutos", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "title"
t.text "content"
t.integer "user_id"
t.integer "category_id"
end
add_index "tutos", ["user_id"], name: "index_tutos_on_user_id"
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "first_name"
t.string "last_name"
t.boolean "admin"
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", unique: true
create_table "votes", force: :cascade do |t|
t.integer "votable_id"
t.string "votable_type"
t.integer "voter_id"
t.string "voter_type"
t.boolean "vote_flag"
t.string "vote_scope"
t.integer "vote_weight"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "votes", ["votable_id", "votable_type", "vote_scope"], name: "index_votes_on_votable_id_and_votable_type_and_vote_scope"
add_index "votes", ["voter_id", "voter_type", "vote_scope"], name: "index_votes_on_voter_id_and_voter_type_and_vote_scope"
end
EDIT here is the error message:
Looks like you may have created at least one Tuto object without a category_id at some point and it's still in your (development?) database. I'm guessing you don't want that, in which case I usually wipe my development database with rake db:reset. Just make sure you're executing commands in development if you do that of course. In the future, you may want to validate the presence of category_id on your Tuto model as well.

Undefined Method for Active Record

When creating a new job, I get an error about an undefined method Employee. I will post relevant sections of my code; thanks in advance for the help!
Here is the error message:
undefined method `employee' for #
ActiveRecord::Associations::CollectionProxy []
_form.html.erb (where error is occuring):
<td colspan="4">Client-Job
# <%= text_field_tag 'client_num', #job.opportunities.employee.office.client_num, :size => "4", :readonly => true, :tabindex => -1 %>
-<%= f.text_field :number %></td>
Jobs Controller:
class JobsController < ApplicationController
before_action :set_job, only: [:show, :edit, :update, :destroy]
skip_load_and_authorize_resource
# GET /jobs
# GET /jobs.json
def index
#jobs = Job.all
end
# GET /jobs/1
# GET /jobs/1.json
def show
end
# GET /jobs/new
def new
#job = Job.new
end
# GET /jobs/1/edit
def edit
end
# POST /jobs
# POST /jobs.json
def create
#job = Job.new(job_params)
respond_to do |format|
if #job.save
format.html { redirect_to #job, notice: 'Job was successfully created.' }
format.json { render :show, status: :created, location: #job }
else
format.html { render :new }
format.json { render json: #job.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /jobs/1
# PATCH/PUT /jobs/1.json
def update
respond_to do |format|
if #job.update(job_params)
format.html { redirect_to #job, notice: 'Job was successfully updated.' }
format.json { render :show, status: :ok, location: #job }
else
format.html { render :edit }
format.json { render json: #job.errors, status: :unprocessable_entity }
end
end
end
# DELETE /jobs/1
# DELETE /jobs/1.json
def destroy
#job.destroy
respond_to do |format|
format.html { redirect_to jobs_url, notice: 'Job was successfully deleted.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_job
#job = Job.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def job_params
params.require(:job).permit(:opportunity_id, :number, :name, :flight_date, :flight_sub, :camera, :roll, :map_type, :plan_only, :lab_only, :est_hrs_model, :due_date, :edge_job_id, :custom_trans, :comp_inhouse, :delivered_date, :done, :control_in, :control_status, :at_date, :control_results, :control_check, :scan_staff, :scan_date, :scan_check, :comp_staff, :comp_date, :comp_check, :comp_sub, :comp_sub_due_date, :comp_sub_rec, :img_staff, :img_date, :img_check, :edit_staff, :edit_date, :edit_check, :notes, :file1, :file2, :file3, :file4, :file5, :add_files)
end
end
Employee Controller:
class EmployeesController < ApplicationController
before_action :set_employee, only: :show
skip_load_and_authorize_resource
# GET /employees
# GET /employees.json
def index
#employees = Employee.all
end
# GET /employees/1
# GET /employees/1.json
def show
end
# GET /employees/new
def new
#employee = Employee.new
end
# GET /employees/1/edit
def edit
end
# POST /employees
# POST /employees.json
def create
#employee = Employee.new(employee_params)
respond_to do |format|
if #employee.save
format.html { redirect_to #employee, notice: 'Contact was successfully created.' }
format.json { render :show, status: :created, location: #employee }
else
format.html { render :new }
format.json { render json: #employee.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /employees/1
# PATCH/PUT /employees/1.json
def update
respond_to do |format|
if #employee.update(employee_params)
format.html { redirect_to #employee, notice: 'Contact was successfully updated.' }
format.json { render :show, status: :ok, location: #employee }
else
format.html { render :edit }
format.json { render json: #employee.errors, status: :unprocessable_entity }
end
end
end
# DELETE /employees/1
# DELETE /employees/1.json
def destroy
#employee.destroy
respond_to do |format|
format.html { redirect_to employees_url, notice: 'Contact was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_employee
#employee = Employee.find(params[:id])
#opportunities = #employee.opportunities.all
end
# Never trust parameters from the scary internet, only allow the white list through.
def employee_params
params.require(:employee).permit(:office_id, :f_name, :l_name, :suffix, :position, :email, :phone, :ext, :mobile, :per_email, :per_phone, :archived, :replacement)
end
end
Job Model:
class Job < ActiveRecord::Base
mount_uploader :file1, AttachmentUploader
belongs_to :cost_proposal
has_many :opportunities
end
Employee Model:
class Employee < ActiveRecord::Base
belongs_to :office
has_many :opportunities
has_one :user
delegate :company, to: :office
validates :f_name, :l_name, presence: true
def self.emp_id(emp_id)
find_by(id: emp_id)
end
def self.emp_f_name(emp_id)
find_by(id: emp_id).f_name
end
def name_1
[f_name, l_name].compact.join(' ')
end
def full_name
if suffix?
[name_1, suffix].compact.join(', ')
else
name_1
end
end
def self.emp_full_name(emp_id)
find_by(id: emp_id).full_name
end
def full_phone
if ext?
[phone, ext].compact.join(' ext: ')
else
phone
end
end
end
Schema.rb:(relevant tables)
create_table 'employees', force: true do |t|
t.integer 'office_id'
t.string 'f_name'
t.string 'l_name'
t.string 'suffix'
t.string 'email'
t.string 'phone'
t.string 'ext'
t.string 'mobile'
t.string 'per_email'
t.string 'per_phone'
t.integer 'archived'
t.integer 'replacement'
t.datetime 'created_at'
t.datetime 'updated_at'
t.string 'position'
end
create_table 'jobs', force: true do |t|
t.integer 'cost_proposal_id'
t.string 'number'
t.string 'name'
t.date 'flight_date'
t.string 'flight_sub'
t.string 'camera'
t.string 'roll'
t.string 'map_type'
t.integer 'plan_only'
t.integer 'lab_only'
t.integer 'est_hrs_model'
t.date 'due_date'
t.integer 'edge_job_id'
t.integer 'custom_trans'
t.integer 'comp_inhouse'
t.date 'delivered_date'
t.integer 'done'
t.date 'control_in'
t.string 'control_status'
t.date 'at_date'
t.string 'control_results'
t.integer 'control_check'
t.string 'scan_staff'
t.date 'scan_date'
t.integer 'scan_check'
t.string 'comp_staff'
t.date 'comp_date'
t.integer 'comp_check'
t.string 'comp_sub'
t.date 'comp_sub_due_date'
t.integer 'comp_sub_rec'
t.string 'img_staff'
t.date 'img_date'
t.integer 'img_check'
t.string 'edit_staff'
t.date 'edit_date'
t.integer 'edit_check'
t.text 'notes'
t.string 'file1'
t.string 'file2'
t.string 'file3'
t.string 'file4'
t.string 'file5'
t.string 'add_files'
t.datetime 'created_at'
t.datetime 'updated_at'
t.integer 'flown'
t.integer 'cust_trans'
t.integer 'delivered'
t.string 'at_staff'
t.integer 'at_check'
t.integer 'opportunity_id'
end
**Update:**Adding opportunity client model/schema
Opportunity Model:
class Opportunity < ActiveRecord::Base
belongs_to :employee
has_one :user
has_many :film_specs
has_many :digital_specs
has_many :film_quotes
has_many :cost_proposals
has_many :jobs
validates :opp_status_id, presence: true
end
Opportunity Schema:
create_table 'opportunities', force: true do |t|
t.integer 'employee_id'
t.integer 'emp2_id'
t.integer 'emp3_id'
t.string 'name'
t.datetime 'prop_date'
t.integer 'opp_status_id'
t.string 'delay'
t.date 'con_signed'
t.integer 'quote_won_id'
t.float 'total_cost'
t.date 'exp_close'
t.integer 'pri_comp_id'
t.text 'notes'
t.datetime 'created_at'
t.datetime 'updated_at'
t.string 'lost'
t.string 'won'
t.string 'location'
t.integer 'pm_id'
t.integer 'job_id'
end
Client Model:
class Company < ActiveRecord::Base
mount_uploader :logo, LogoUploader
has_many :offices
has_many :employees, through: :offices
has_one :office_type
validates :name, uniqueness: { message: 'That company already exists' }
def self.master_company
find_by(type_id: 1)
end
def self.company_name(comp_id)
find_by(id: comp_id).name
end
end
Client schema:
create_table 'companies', force: true do |t|
t.string 'name'
t.string 'website'
t.string 'logo'
t.datetime 'created_at'
t.datetime 'updated_at'
t.integer 'type_id'
end
Your issue is that you're calling .employee on an ActiveRecord collection (#job.opportunities). It looks like you're trying to display the client number using #job.opportunities.employee.office.client_num which will never work since you would first need to select a single opportunity record to get its employee. You should revisit how your Job and Office models are associated.

Users not associating with object on create action

For some reason my users aren't associating with the object when the object is created. Each time that I add a new "industry" the user_id is just coming up as nil. I'm able to update this in the console but it's not working when I create the industry.
user.rb
class User < ActiveRecord::Base
has_many :industries
has_many :categories
has_many :startups
end
Industry.rb
class Industry < ActiveRecord::Base
belongs_to :user
has_many :categories
end
industries_controller.rb
class IndustriesController < ApplicationController
before_action :set_industry, only: [:show, :edit, :update, :destroy]
def index
#industries = Industry.all.order("created_at DESC").paginate(:page => params[:page], :per_page => 20)
authorize #industries
end
def show
#categories = #industry.categories
end
def new
#industry = Industry.new
authorize #industry
end
def edit
end
def create
#industry = Industry.new(industry_params)
authorize #industry
respond_to do |format|
if #industry.save
format.html { redirect_to #industry, notice: 'industry was successfully created.' }
format.json { render :show, status: :created, location: #industry }
else
format.html { render :new }
format.json { render json: #industry.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if #industry.update(industry_params)
format.html { redirect_to #industry, notice: 'Industry was successfully updated.' }
format.json { render :show, status: :ok, location: #indsutry }
else
format.html { render :edit }
format.json { render json: #industry.errors, status: :unprocessable_entity }
end
end
end
def destroy
#industry.destroy
respond_to do |format|
format.html { redirect_to industries_url, notice: 'Inustry was successfully destroyed.' }
format.json { head :no_content }
end
end
private
def set_industry
#industry = Industry.find(params[:id])
authorize #industry
end
# def correct_user
# #industry = current_user.industries.find_by(id: params[:id])
#redirect_to industries_path, notice: "Not authorized to edit this Industry" if #industry.nil?
# end
def industry_params
params.require(:industry).permit(:name)
end
end
Schema
create_table "industries", force: true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "user_id"
end
create_table "users", force: true do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at"
t.datetime "updated_at"
t.string "role"
t.string "name"
end
def create
#industry = Industry.new(industry_params)
authorize #industry
#industry.user = current_user
# blah-blah
end

Resources