Rails - 如何在视图中引用命名空间 table 属性

Rails - how to reference namespaced table attributes in views

我正在尝试学习如何在我的 Rails 5 应用程序中使用命名空间。

我有一个组织模型,我也在文件夹名"stance"下制作了一系列嵌套模型。其中一个模型称为概览。

协会是:

Organisation.rb

has_one :overview, class_name: Stance::Overview
    accepts_nested_attributes_for :overview,  reject_if: :all_blank, allow_destroy: true

姿态::概览

class Stance::Overview < ApplicationRecord
    belongs_to :organisation, inverse_of: :overview

我的姿态资源控制器嵌套在名为 stance 的文件夹下。

我的路线是:

namespace :stance do
    resources :overviews
    end

在我的部分立场视图中,我试图从概览中渲染属性 table。

我试过:

<p><%= @overview.internal_explanation %></p>
<p><%= @stance_overview.internal_explanation %></p>
<p><%= @stance.overview.internal_explanation %></p>
<p><%= @stance::overview.internal_explanation %></p>

我想在我的组织展示中展示这个部分。我正在尝试这样做:

<%= render 'stance/overviews/internal', overview: @overview %>

但我不知道如何访问概览 table。我需要在关联中添加对 'stance' 的引用吗?

我可以看到在控制台中我需要写:

o = Stance::Overview.create(internal_explanation: "test") 
o = Stance::Overview.first

但我看不到如何在代码中使用它。

我在控制台看到有这个属性的记录。

架构中 table 的名称是 "stance_overview"。

我的组织控制器有:

class OrganisationsController < ApplicationController
  before_action :set_organisation, only: [:show, :edit, :update, :destroy]

    def index
    @organisations = Organisation.all

  end

  def show

  end

  def new
    @organisation = Organisation.new
    @organisation.build_overview

  end

  def edit
    @organisation.build_overview unless @organisation.overview
  end

  def create
    @organisation = Organisation.new(organisation_params)

    respond_to do |format|
      if @organisation.save
        format.html { redirect_to @organisation, notice: 'Organisation was successfully created.' }
        format.json { render :show, status: :created, location: @organisation }
      else
        format.html { render :new }
        format.json { render json: @organisation.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @organisation.update(organisation_params)
        format.html { redirect_to @organisation, notice: 'Organisation was successfully updated.' }
        format.json { render :show, status: :ok, location: @organisation }
      else
        format.html { render :edit }
        format.json { render json: @organisation.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @organisation.destroy
    respond_to do |format|
      format.html { redirect_to organisations_url, notice: 'Organisation was successfully destroyed.' }
      format.json { head :no_content }
    end
  end




private
    # Use callbacks to share common setup or constraints between actions.
    def set_organisation
      @organisation = Organisation.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def organisation_params
      params.fetch(:organisation, {}).permit(:title,  :comment,
        overview_attributes: [:internal_explanation, :external_explanation ]

        )
    end


end

我还尝试将组织的强参数定义为:

 stance_overview_attributes: [:internal_explanation, :external_explanation ]

我不断收到一条错误消息:

undefined method `internal_explanation' for nil:NilClass

任何人都可以向我推荐材料以帮助我了解如何在我的应用程序中使用名称空间。我试图了解它的基本原理,以便我可以积累一些知识。我通过反复试验找到了东西,但不了解实际需要什么(尽管在这种情况下,none 我的尝试正在解决)。

当您不在 Stance 命名空间中工作时,要访问 Overview 模型 (table),您必须使用 Stance::Overview。例如,如果在 Stance 命名空间中的控制器中工作,您可以仅使用 Overview 进行访问。

要从关系中获取访问权限,您不需要任何额外的符号,只需 @organisation.overview

如果我对你的理解正确,你必须将你的部分声明为

<%= render 'stance/overviews/internal', overview: @organisation.overview %>

并且在部分中你必须使用 overview 而没有 @