正确的模型设置
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
我是 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