Rails项目中在Tracker详情页展示关联Goal信息的问题
问题解决步骤
1. 修正模型关联
你的模型关联方向错误:因为trackers表存在goal_id外键,所以Tracker应该属于一个Goal,而非拥有一个Goal。
修改Tracker模型:
class Tracker < ApplicationRecord belongs_to :contact belongs_to :goal # 替换原来的has_one :goal has_many :emails, dependent: :destroy end
Goal模型关联保持正确:
class Goal < ApplicationRecord has_many :stages, dependent: :destroy has_many :trackers end
2. 修正控制器的show方法
你当前用params[:id]查询Goal是错误的——params[:id]是当前Tracker的ID,并非Goal的ID。直接通过已加载的@tracker对象获取关联的Goal即可:
修改TrackersController的show方法:
def show @goal = @tracker.goal # 通过关联获取对应的Goal end
也可以直接在视图中使用@tracker.goal,无需单独定义@goal变量。
3. 修正视图代码
视图中变量名和关联调用错误,同时建议增加空值判断避免报错:
修改Tracker详情页视图:
<div class="card"> <h3>Goal</h3> <% if @tracker.goal.present? %> <%= @tracker.goal.name %> <% else %> <span>未关联目标</span> <% end %> </div>
如果使用控制器中定义的@goal变量,也可写成:
<div class="card"> <h3>Goal</h3> <% if @goal.present? %> <%= @goal.name %> <% else %> <span>未关联目标</span> <% end %> </div>
额外注意事项
- 确保
trackers数据表的goal_id字段类型为integer,若允许Tracker不关联Goal,需在Tracker模型的belongs_to :goal后添加optional: true。 - 新建或更新Tracker时,确保
goal_id参数正确传入(你的tracker_params已包含:goal_id,这部分无需修改)。
内容的提问来源于stack exchange,提问作者Cat Morley
相关产品推荐
相关产品推荐

