Question

I'm a litte stuck unfortunately, maybe somebody can help? Thank you!

I have 3 classes user,manager and driver. manager and driver are subclasses of user. driver has a belongs_to relationship with manager:

class User < ActiveRecord::Base
  attr_accessible :email, :name
end

class Manager < User
has_many :drivers
end

class Driver < User
belongs_to :manager
end

I use STI:

ActiveRecord::Schema.define(:version => 20140104122558) do

  create_table "users", :force => true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
    t.string   "type"
    t.integer  "manager_id"
  end

  add_index "users", ["manager_id"], :name => "index_users_on_manager_id"

end

manager_id was added to store a reference to the manager, when a new driver is created in this column the manager-id should be stored which alas doesn't work. The column "manager_id" stays empty. Maybe somebody knows how to save the association automatically?

Routes:

resources :managers do
    resources :drivers
  end

class ManagersController < ApplicationController

  def index
    @managers = Manager.all
  end

  def show
    @manager = Manager.find(params[:id])
  end

  def new
    @manager = Manager.new
  end

  def edit
     @manager = Manager.find(params[:id])
  end

  def create
    @manager = Manager.new(params[:manager])
if @manager.save
    # Handle a successful save.
    render 'new'
else
    render 'new'
end
  end

  def update
    @manager = Manager.find(params[:id])
  end

   def destroy
     @manager = Manager.find(params[:id])
     @manager.destroy
   end

 end



 class DriversController < ApplicationController

  def index
    @drivers = Driver.all
  end

  def show
    @driver = Driver.find(params[:id])
  end

  def new
    @driver     = Driver.new
@manager    = Manager.find_by_id(params[:manager_id])
  end

  def edit
    @driver = Driver.find(params[:id])
  end

  def create
    @driver = Driver.new(params[:driver])
@manager    = Manager.find_by_id(params[:manager_id])
if @driver.save
    # Handle a successful save.
    render 'new'
else
    render 'new'
end
  end

  def update
    @driver = Driver.find(params[:id])
  end

  def destroy
    @driver = Driver.find(params[:id])
    @driver.destroy
  end

end

In the create action shouldn't params[id] instead of params[manager_id] be used?

<h1>New driver</h1>

<%= form_for [@manager,@driver] do |f| %>
    <%= f.label :name %>
<%= f.text_field :name %><br />
<%= f.label :email %>
<%= f.text_field :email %><br />
<%= f.submit "Create new driver" %>
<% end %>
Was it helpful?

Solution

There's a gist which shows how to solve this: Solution on github

Controllers:

class ManagersController < ApplicationController

  def index
    @managers = Manager.all
  end

  def new
    @manager = Manager.new
  end

  def create
    @manager = Manager.new(params[:manager])
    if @manager.save
       redirect_to @manager
    else
       render 'new'
    end
  end

  def show
     @manager = Manager.find(params[:id])
  end

end


class DriversController < ApplicationController

   def index
    @manager = Manager.find(params[:manager_id])
    @drivers = @manager.drivers.all
   end

def new
    @manager = Manager.find(params[:manager_id])
    @driver = @manager.drivers.new
end

def create
    @manager = Manager.find(params[:manager_id])
    @driver = @manager.drivers.new(params[:driver])
    if @driver.save
        redirect_to [@manager, @driver]
    else
        render 'new'
    end
end

def show
    @manager = Manager.find(params[:manager_id])
    @driver = @manager.drivers.find(params[:id])
end

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