找不到'id'=的车辆

时间:2018-03-03 14:41:31

标签: ruby-on-rails

我正在尝试添加车辆的服务详情。在我的车辆的显示页面上,我放了一个链接添加新服务详情的按钮

<%= link_to 'Add Service Details', {:controller => :services, :action => :new, :vehicle_id => @vehicle.id},  {class: "btn btn-secondary"} %>

网址将显示如下车辆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并将其保存为外键。我不确定以上是否是正确的方法,但我喜欢它,所以当用户查看车辆时,他们有一个按钮,允许他们添加服务细节。

2 个答案:

答案 0 :(得分:1)

用户去 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

答案 1 :(得分:0)

如果您想要的是一个表单,您可以将其放置在车辆的show action上以创建新服务,而不仅仅是您想要的工作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