我试图添加车辆的服务细节。在我的车辆的显示页面上,我放了一个链接按钮来添加新的服务细节
<%= link_to 'Add Service Details', {:controller => :services, :action => :new, :vehicle_id => @vehicle.id}, {class: "btn btn-secondary"} %>
该网址将显示vehicle_id,如下面的http://localhost:3000/services/new?vehicle_id=3
在_form.html.erb上为我提供的服务
<div class="field">
<%= form.label :vehicle_id %>
<%= form.text_field :vehicle_id, id: :service_vehicle_id %>
</div>
在我得到的控制器中
def create
@vehicle = Vehicle.find(params[:vehicle_id])
@service = @vehicle.service.create(service_params)
redirect_to @service, notice: 'Service was successfully created.'
end
和
def new
@vehicle = Vehicle.find(params[:vehicle_id])
@service = Service.new
end
在我的模型中,我将关系定义为
车型
has_many :service
服务模式
belongs_to :vehicle
我的路线文件看起来像
resources :vehicles
resources :services
有人可以帮我使用vehicle_id并将其保存为外键。我不确定以上是否是正确的方法,但我喜欢它,所以当用户查看车辆时,他们有一个按钮,允许他们添加服务细节。
用户转到控制器中的http://localhost:3000/services/new?vehicle_id=3,运行以下代码
def new
#Serch for a vehicle
@vehicle = Vehicle.find(params[:vehicle_id])
# Create a Service object with no vehicle_id set
@service = Service.new
end
就像没有设置vehicle_id一样
<%= form.text_field :vehicle_id, id: :service_vehicle_id %>
提交表单时,应生成没有值的文本字段
def create
# Here must throw an error
@vehicle = Vehicle.find(params[:vehicle_id])
@service = @vehicle.service.create(service_params)
redirect_to @service, notice: 'Service was successfully created.'
end
转到设置车辆ID的新操作
def new
#Serch for a vehicle
@vehicle = Vehicle.find(params[:vehicle_id])
# Create a Service object with no vehicle_id set
@service = Service.new
# Add vehicle id to service
@service.vehicle_id = @vehicle.id
end
如果你想要的是一个表格,你可以放置在车辆的展示动作上创建一个新的服务,而不是你想要的只是你的工厂nested resource:
resources :vehicules do
resources :services, shallow: true
end
这将设置路线,以便您通过POST到/vehicules/:vehicule_id/services
创建新服务。请注意,这会将父ID放在路径中,这样您就不需要将其作为隐藏输入发送。
对于您刚刚做的表单:
<%= form_for([@vehicule, @service || Service.new]) do |f| %>
# inputs go here
<% end %>
# or with Rails 5 'form_with'
# form_with(model: @vehicule, url: [@vehicule, @service || Service.new])
然后设置控制器:
class ServicesController < ApplicationController
before_action :set_vehicule, only: [:new, :create, :index]
def new
@service = @vehicule.services.new
end
def create
@service = @vehicule.services.new(service_params)
if @service.save
# ...
else
# ...
end
end
def index
@services = @vehicule.services
end
# ...
private
def set_vehicule
@vehicule = Vehicule.find(params[:vehicule_id])
end
def service_params
# ...
end
end