我正在构建一个包含两个模型的Rails应用程序,这两个模型都包含另外两个嵌套模型:
联系人-〉跟踪器-〉电子邮件
和
目标-〉阶段-〉模板
我想在特定跟踪器的显示页面上显示来自特定目标的信息,但我正在努力获得正确的数据。
我在我的Tracker参数中有一个goal_id字段,我已经将这一行添加到我的Tracker控制器中,但我认为我做错了:
@goals = Goal.find(params[:id])
我确信这将是一个非常明显的错误,但我是Rails的新手,我似乎无法正确理解它,我很乐意听取您的任何建议。提前感谢!
跟踪器型号:
class Tracker < ApplicationRecord
belongs_to :contact
has_one :goal
has_many :emails, dependent: :destroy
end
目标模型:
class Goal < ApplicationRecord
has_many :stages , dependent: :destroy
has_many :trackers
end
跟踪器控制器:
class TrackersController < ApplicationController
before_action :get_contact
before_action :set_tracker, only: %i[ show edit update destroy ]
# GET /trackers or /trackers.json
def index
@trackers = @contact.trackers
end
# GET /trackers/1 or /trackers/1.json
def show
@goals = Goal.find(params[:id])
end
# GET /trackers/new
def new
@tracker = @contact.trackers.build
end
# GET /trackers/1/edit
def edit
end
# POST /trackers or /trackers.json
def create
@tracker = @contact.trackers.build(tracker_params)
respond_to do |format|
if @tracker.save
format.html { redirect_to contact_trackers_path(@contact), notice: "Tracker was successfully created." }
format.json { render :show, status: :created, location: @tracker }
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @tracker.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /trackers/1 or /trackers/1.json
def update
respond_to do |format|
if @tracker.update(tracker_params)
format.html { redirect_to contact_tracker_path(@contact), notice: "Tracker was successfully updated." }
format.json { render :show, status: :ok, location: @tracker }
else
format.html { render :edit, status: :unprocessable_entity }
format.json { render json: @tracker.errors, status: :unprocessable_entity }
end
end
end
# DELETE /trackers/1 or /trackers/1.json
def destroy
@tracker.destroy
respond_to do |format|
format.html { redirect_to contact_trackers_path(@contact), notice: "Tracker was successfully destroyed." }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def get_contact
@contact = Contact.find(params[:contact_id])
end
def set_tracker
@tracker = @contact.trackers.find(params[:id])
end
# Only allow a list of trusted parameters through.
def tracker_params
params.require(:tracker).permit(:name, :contact_id, :goal_id, :stage_id, :status, :note)
end
end
显示跟踪器的页面视图:
<div class="card">
<h3>Goal</h3>
<%= @goals.name %>
</div>
1条答案
按热度按时间uttx8gqw1#
在TrackersController中,您有:
这看起来像是你正在获取一个TrackerID,并使用该ID作为目标的 *ID *。
Tracker 709不太可能(以709为例)与Goal 709相关联,因此这很可能是一个错误。不过,您确实在模型之间有关联,因此您可以使用它来查找与Tracker相关联的目标。
注意上面我使用的是
@goal
而不是@goals
,因为只有一个相关的。你需要更新你的视图来使用@goal
。* 或者 * 在你的视图中,你可以直接通过@tracker.goal
访问目标;那么你根本不需要设置@goal
。潜在的模型问题:它看起来像
Tracker has_one goal
和Goal has_many trackers
。这看起来像你想要一个正常的n对1关系。所以你可能想把has_one
改为belongs_to
。(它不意味着所有权。)就像你告诉Rails的那样:
Goal has_many trackers
-〉trackers
表有一个定义关系的goal_id
列。Tracker has_one goal
-〉goals
表有一个定义关系的tracker_id
列。我不知道您运行了什么迁移,但您可能只需要这两个列(
goal_id
和tracker_id
)中的一个。您应该查看一下您的模式并解决这个问题。(您可能还想尝试使用annotate_models gem,这样您就可以轻松地看到表中的列。)