Rails跨嵌套模型下Goal页关联Tracker的链接问题求助
你的链接失效是因为路由助手使用错误:当前路由中Tracker是嵌套在Contact资源下的,不存在goal_tracker_path这个路由辅助方法,调用它会直接报错。
从你的routes.rb可以看到,Tracker的路由定义是:
resources :contacts do resources :trackers do resources :emails end end
对应的Tracker详情页路由是/contacts/:contact_id/trackers/:id,对应的路由助手是contact_tracker_path(contact, tracker)。
1. 修正链接代码
在Goal的show.html.erb中,把错误的goal_tracker_path替换为contact_tracker_path,并传入tracker所属的contact和tracker本身:
<% @goal.trackers.each do |tracker| %> <hr> <%= link_to contact_tracker_path(tracker.contact, tracker) do %> <p><%= tracker.title %> | <%= tracker.contact.first_name %></p> <% end %> <% end %>
(顺便把for tracker in ...换成Rails更推荐的each迭代写法)
2. 优化控制器代码
你的Goal控制器show方法里的@trackers = Tracker.all和@tracker = Tracker.all完全多余,页面里用的是@goal.trackers,直接删掉这两行即可:
def show # 移除多余的Tracker.all赋值 end
可选:添加Goal与Tracker的嵌套路由(如果需要)
如果你希望有/goals/:goal_id/trackers/:id这样的路由,可以在routes.rb的goals资源下添加trackers嵌套:
resources :goals do resources :stages do resources :templates end resources :trackers # 新增这一行 end
此时运行rails routes会看到新增的goal_tracker_path路由助手,你的原链接代码就能正常使用了。不过注意,这样会生成两套指向Tracker#show的路由,需要确保TrackersController能处理两种参数(contact_id和goal_id)。
内容的提问来源于stack exchange,提问作者Cat Morley

