正确的模型设置

时间:2017-12-08 07:28:15

标签: ruby-on-rails associations models

我是stackoverflow的新手,所以如果格式不佳,我很抱歉。

在我目前的项目中,我有一个模型驱动程序,它有很多行程。这些旅行有许多里程,回程,选择,下降和小时。当我创建一个新的旅行时,我希望能够将它与驱动程序相关联,但我还希望能够在同一页面上添加里程数,回程,选择和删除时间。我不确定如何构建我的路线。我成功地为一个司机创造了一个旅行而没有添加额外的模型到旅行但是从那里我很难过。到目前为止,我只创建了里程模型/控制器,以满足与行程相关的需求。任何朝着正确方向的推动都会非常感激。

驱动程序模型

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

Trips控制器

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

驱动程序控制器

  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

1 个答案:

答案 0 :(得分:0)

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

https://github.com/nathanvda/cocoon

Drifting Ruby有一个视频,详细显示了易于遵循的流程。 https://www.youtube.com/watch?v=56xjUOAAZY8

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

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