正确的模型设置

Proper model set up

我是 Whosebug 的新手,如果格式不正确,我深表歉意。

在我当前的项目中,我有一个模型 Driver,它有很多行程。这些旅行有很多里程、回程、接送、下车和小时数。当我创建新行程时,我希望能够将它关联到 driver,但我还希望能够在同一页面上添加里程、回程、接送和小时数。我不确定如何为此构建我的路线。我已经成功地为 driver 创建了一次旅行,而没有为旅行添加额外的模型,但从那里我被难住了。到目前为止,我只为需要与旅行关联的内容创建了里程 model/controller。任何朝着正确方向的推动都将不胜感激。

Driver 型号

class Driver < ApplicationRecord
  has_many :trips
end

行程模型

class Trip < ApplicationRecord
  belongs_to :driver
  has_many :mileages
  accepts_nested_attributes_for :mileages
  default_scope {order(date: :asc)}
  validates :total, presence: true
  validates :date, presence: true
  validates_uniqueness_of :trip_number, :allow_nil => true, :allow_blank => 
  true 

end

里程模型

class Mileage < ApplicationRecord
  belongs_to :trip
end

行程控制器

def index
  @trips = Trip.all
end

def show
end

def new
  @driver = Driver.find(params[:driver_id])
  @trip = Trip.new
end

def edit
end

def create
  @driver = Driver.find(params[:driver_id])
  @trip = Trip.new(trip_params)
  @driver.trips.create(trip_params)
  respond_to do |format|
    if @driver.trips.create(trip_params)
      flash[:notice] = "Trip successfully created"
      redirect_to new_driver_trip_path(@driver)
    else
      flash[:warning] = "Unable to create trip"
      redirect_to new_driver_trip_path(@driver)
    end
end
private

  def set_trip
    @trip = Trip.find(params[:id])
  end

  def trip_params
    params.require(:trip).permit(:trip_number, :date, :driver_id, :total)
  end

end

里程控制器

  def new
    @mileage = Mileage.new
  end

  def create
    @mileage.create(mileage_params)
  end

  private

    def mileage_params
      params.require(:mileage).permit(:miles, :rate, :total)
    end
  end
end

Driver 控制器

  def index
    @drivers = Driver.all
  end

  def show
  end

  def new
    @driver = Driver.new
  end

  def edit
  end

  def create
    @driver = Driver.new(driver_params)

    respond_to do |format|
      if @driver.save
          format.html { redirect_to @driver, notice: 'Driver was 
           successfully created.' }
          format.json { render :show, status: :created, location: @driver }
      else
        format.html { render :new }
        format.json { render json: @driver.errors, status: 
         :unprocessable_entity }
      end
    end
  end
  private

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

    def driver_params
      params.require(:driver).permit(:first_name, :last_name, :email, :unit)
    end
end

如果您想在同一页面上创建嵌套模型。即使用 accepts_nested_attributes_for 的旅行页面内的里程数,您可以使用 cocoon gem.

https://github.com/nathanvda/cocoon

漂移 Ruby 有一个视频详细展示了这个过程,很容易理解。 https://www.youtube.com/watch?v=56xjUOAAZY8

您也可以手动完成,但需要多做一些工作。 使用 Cocoon,您将拥有一个 Driver Controller 和 Trip 控制器,但您不需要 Milage 控制器,因为它是通过 Trip Controller nested_attributes 处理的。

如果您想手动完成,则需要一些 JavaScript。您可以就此主题关注 Ryan Bates RailsCast。 railscasts.com/episodes/196-nested-model-form-revised