我正在尝试学习如何在我的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
在我的立场视图中,我试图从概览表中渲染属性。
我试过了:
<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 %>
但我无法弄清楚如何访问概览表。我是否需要添加对“立场”的引用?协会?
我可以在控制台中看到我需要写的内容:
o = Stance::Overview.create(internal_explanation: "test")
o = Stance::Overview.first
但我无法在代码中看到如何使用它。
我可以在控制台中看到该属性有一条记录。
架构中表格的名称是&#34; stance_overview&#34;。
我的组织控制员有:
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
任何人都可以向我推荐材料,以帮助我学习如何在我的应用中使用命名空间。我试图理解这个的基本原理,以便我可以提供一些知识。我通过反复试验找到了一些东西但却没有理解实际需要的东西(尽管在这种情况下,我的尝试都没有成功)。
答案 0 :(得分:1)
要在Overview
名称空间中工作时访问Stance
模型(表格),您必须使用Stance::Overview
。如果在Stance
命名空间中的控制器中工作,则只能使用Overview
进行访问。
要从关系中获取权限,您只需@organisation.overview
。
如果我在你的情况下理解正确,你必须声明你的部分为
<%= render 'stance/overviews/internal', overview: @organisation.overview %>
在部分内容中,您必须使用overview
而不使用@
。