目前,我的地图和行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
答案 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
在其他地方找到地图。