Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 不能';找不到带有';id'=_Ruby On Rails - Fatal编程技术网

Ruby on rails 不能';找不到带有';id'=

Ruby on rails 不能';找不到带有';id'=,ruby-on-rails,Ruby On Rails,我正在尝试添加车辆的服务详细信息。在我的车辆的显示页面上,我放置了一个按钮,该按钮链接到添加新的服务详细信息 <%= link_to 'Add Service Details', {:controller => :services, :action => :new, :vehicle_id => @vehicle.id}, {class: "btn btn-secondary"} %> 及 在我的模型中,我将关系定义为 车型 has_many :service

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

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

在我的模型中,我将关系定义为

车型

has_many :service
服务模式

belongs_to :vehicle
我的路由文件看起来像

  resources :vehicles 
  resources :services 
有人能帮我使用车辆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
end
如未设置车辆识别号

<%= form.text_field :vehicle_id, id: :service_vehicle_id %>
转至新操作设置车辆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

如果您想要的是一个表格,您可以将其放置在车辆的显示动作上以创建新的服务,那么您想要的只是您的普通操作:

这将设置路线,以便您通过发送到
/vehicleules/:vehicleue\u 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])

#输入到这里
#或与轨道5'形式_与'
#表格(型号:@vehicule,网址:[@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
class-ServicesController
最初在车型中有许多服务。和创建操作中的
@service=@vehicle.serviceS.create(服务参数)
。您不需要
表单中的车辆id
,请显示您收到的参数和服务参数方法Hi Pablo,我该怎么做?@MAhmed,看看您的服务器logs@Vasilisa我做了一些改变,得到了同样的错误,部分原因是它起作用了。车辆id现在正在显示,但当我单击“保存”时,我仍然无法找到“id”=其选取@vehicle=vehicle.find(params[:vehicle\u id])作为问题的车辆,因为我最终解决了这个问题。我必须将服务控制器中的创建位更改为
def create
@vehicle=vehicle.find(params[:vehicle\u id])
@service=service.new(service\u params)
if@service.save
重定向到@service,注意:“服务已成功创建。”
else
end
end
此答案假设您首先修复了@Vasilisa指出的关联中的复数化错误。
 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
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
resources :vehicules do
  resources :services, shallow: true
end
<%= 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