Rails嵌套路由错误的id

时间:2017-12-16 22:27:40

标签: ruby-on-rails

目前,我的地图和行has_many行之间存在关联的嵌套路由。

resources :maps do
  resources :rows
end

在查看我的佣金路线时:

edit_map_row GET    /maps/:map_id/rows/:id/edit(.:format) rows#edit

这是弄乱一些事情,因为如果我在编辑一行时查看网址,它会给我这个网址。

http://localhost:3000/maps/11/rows/1/edit

map_id不是11;它实际上是1,反之亦然。我怎样才能在我的路线中改变这一点,而不是map_id是11而它是1而row_id实际上是11?

路线应如下所示:

edit_map_row GET /maps/:id/rows/:row_id/edit(.:format) rows#edit

如果有帮助,以下是我的控制器中的设置方法。

地图控制器

private
    def set_row
      @row = Row.find(params[:id])
    end

行控制器

private
    def set_map
      @map = Map.find(params[:id])
    end

2 个答案:

答案 0 :(得分:0)

您的路由是正确的。路由中的最后一个控制器ID始终命名为id,前面的所有控制器ID都显示id之前的控制器名称。

你的佣金路线似乎是正确的。

但是您的某个私有方法存在问题:

地图控制器中的

private
    def set_row
      @row = Row.find(params[:id])
    end

由于您的地图资源位于行资源之上,因此您无法在此处拥有任何行参数。导致地图控制器的任何操作的路径将永远不会显示任何行。

在行控制器中,你的私有方法也是错误的,这次map param和row param都是可用的,但是当map在行之前时,你应该调用如下:

private
    def set_map
      @map = Map.find(params[:map_id])
    end

我的问题是:你现在有没有触发任何错误?并确保当您将嵌套路径传递到link_to标记(例如edit_map_row)时,您在括号中传递了正确的ID:

edit_map_row_path(map_id, row_id)

map_id和row_idd是他们的名字所暗示的,但你可以从@ map.id等变量访问...

答案 1 :(得分:0)

你还没有真正分享任何上下文来表明你正在做任何复杂的事情,以保证与铁路公约作斗争。

提供给你的嵌套路线是按照惯例,并且参数名称是设计的(地图为:map_id,行为:id)。在您当前的代码中,您尝试使用set_map param在RowsController:id,当表面上它是一个属于某一行的ID时,您想要的对象在那条路上工作。

MapsController我不知道为什么你需要使用set_row(如果你在某个地方打电话,请分享)。您始终可以通过调用@map.rows

来查找地图的行

点击地图控制器的地图路线应该有一个:id参数,然后它将属于地图的ID。你可能想要这样:

应用/控制器/ maps_controller.rb

private
  set_map
    @map ||= Map.find(params[:id])
  end

对于你的行控制器,如你所见,它需要一个名为:map_id的参数,然后:id参数将属于一行。

然后你会有这样的事情:

应用/控制器/ rows_controller.rb

 private
   def set_map
     @map ||= Map.find(params[:map_id])
   end

   def set_row
     @row ||= Row.find(params[:id])
   end

您当然可以跳过set_map并使用row.map在其他地方找到地图。