【问题标题】:Unable to route to child resource - Nested routes无法路由到子资源 - 嵌套路由
【发布时间】:2017-07-05 13:10:48
【问题描述】:

这几天我一直在用头撞这个......

我的 routes.rb 文件如下所示:

resources :vehicles do
 member do
   resources :services  
 end
end

我的 service.rb 文件显示:

class Service < ActiveRecord::Base
  belongs_to :vehicle
end

我的 vehicle.rb 文件显示:

class Vehicle < ActiveRecord::Base
  has_many :services, :dependent => :destroy
end

这里是 services_controller.rb

class ServicesController < ApplicationController

  def index
    @vehicle = Vehicle.find(params[:id])
    @services = @vehicle.services.order('created_at DESC')
  end

  def show
    @vehicle = Vehicle.find(params[:id])
    @service = Vehicle.services.find(params[:service_id])
  end

  def new
    @vehicle = Vehicle.find(params[:id])
    @service = @vehicle.services.new
  end 

  def create
    @vehicle = Vehicle.find(params[:id])
    @service = @vehicle.services.build(service_params)
    if @service.save
      redirect_to @vehicle
    else
      render :new
    end
  end


  private
    def service_params
       params.require(:service).permit(:service_option, :odometer, 
   :current_service, :price, :comments, :next_service)
  end

end

这里是服务#index

<h1>Services</h1>


<% @services.each do |s| %>
  <%= link_to "Details", service_path(s) %>
  <%= s.created_at %>
  <%= s.service_option %>
  <%= s.odometer %><br>
<% end %>

点击“详情”链接或手动输入网址

http://localhost:3000/vehicles/2/services/7

给我系统地相同的路由错误:

ActiveRecord::RecordNotFound in ServicesController#show 找不到“id”=7 的车辆

Extracted source (around line #10):

def show
   @vehicle = Vehicle.find(params[:id])
   @service = Vehicle.services.find(params[:service_id])
end

它将服务 ID 传递给车辆对象/变量,我不知道为什么!

谢谢一百万!

【问题讨论】:

    标签: ruby-on-rails ruby routes nested


    【解决方案1】:

    在您的services#show 方法中,您使用错误参数 获取vehicleservice。还有Vehicle.services错了,应该是@vehicle.services

    def show
      @vehicle = Vehicle.find(params[:vehicle_id])
      @service = @vehicle.services.find(params[:id])
    end
    

    更新:

    你应该删除路由中的member,否则它会产生类似的路由

    service GET  /vehicles/:id/services/:id(.:format)  services#show
    

    不相关

    resources :vehicles do
      resources :services  
    end
    

    所以现在你将拥有像

    这样的路线
    service GET  /vehicles/:vehicle_id/services/:id(.:format)  services#show
    

    这是相关的,您可以使用params[:vehicle_id] 获取车辆并使用params[:id] 进行服务

    不要忘记更改路由助手。例如service_path 将变为vehicle_service_path

    <%= link_to "Details", vehicle_service_path(@vehicle,s) %>
    

    【讨论】:

    • 帕万,感谢您回答我的问题。这现在完全有意义并且工作正常。非常感谢您的帮助!
    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2011-05-23
    相关资源
    最近更新 更多