ruby-on-rails 显示不相关嵌套模型的信息

oug3syen  于 2023-04-22  发布在  Ruby
关注(0)|答案(1)|浏览(127)

我正在构建一个包含两个模型的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>
uttx8gqw

uttx8gqw1#

在TrackersController中,您有:

# GET /trackers/1 or /trackers/1.json
  def show
    @goals = Goal.find(params[:id])
  end

这看起来像是你正在获取一个TrackerID,并使用该ID作为目标的 *ID *。
Tracker 709不太可能(以709为例)与Goal 709相关联,因此这很可能是一个错误。不过,您确实在模型之间有关联,因此您可以使用它来查找与Tracker相关联的目标。

@goal = @tracker.goal

注意上面我使用的是@goal而不是@goals,因为只有一个相关的。你需要更新你的视图来使用@goal。* 或者 * 在你的视图中,你可以直接通过@tracker.goal访问目标;那么你根本不需要设置@goal
潜在的模型问题:它看起来像Tracker has_one goalGoal has_many trackers。这看起来像你想要一个正常的n对1关系。所以你可能想把has_one改为belongs_to。(它不意味着所有权。)
就像你告诉Rails的那样:

  1. Goal has_many trackers-〉trackers表有一个定义关系的goal_id列。
  2. Tracker has_one goal-〉goals表有一个定义关系的tracker_id列。
    我不知道您运行了什么迁移,但您可能只需要这两个列(goal_idtracker_id)中的一个。您应该查看一下您的模式并解决这个问题。(您可能还想尝试使用annotate_models gem,这样您就可以轻松地看到表中的列。)

相关问题