Я пытаюсь узнать, как использовать пространства имен в моем приложении Rails 5.Rails - как ссылаться на атрибуты таблицы с именами в представлениях
У меня есть модель организации, и я также сделал серию вложенных моделей под названием папки «stance». Одна из этих моделей называется обзором.
Ассоциации являются:
Organisation.rb
has_one :overview, class_name: Stance::Overview
accepts_nested_attributes_for :overview, reject_if: :all_blank, allow_destroy: true
Stance :: Обзор
class Stance::Overview < ApplicationRecord
belongs_to :organisation, inverse_of: :overview
Мои контроллеры для мировоззренческими ресурсы вложены в папку под названием позиции.
Мои маршруты:
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
, но я не могу понять, как использовать это в самом коде.
Я вижу на консоли, что есть запись для этого атрибута.
Название таблицы в схеме «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
Я также попытался определения сильных Params для организации как:
stance_overview_attributes: [:internal_explanation, :external_explanation ]
Я получаю сообщение об ошибке, которая говорит:
undefined method `internal_explanation' for nil:NilClass
Может ли кто-нибудь ссылаться на материалы, чтобы помочь мне узнать, как использовать пространства имен в моем приложении. Я пытаюсь понять основы этого, чтобы я мог накопить некоторые знания. Я нахожу вещи посредством проб и ошибок, но не понимаю, что на самом деле требуется (хотя в этом случае ни одна из моих попыток не работает).
где вы устанавливаете '@ overview'? Похоже, что во время работы он равен нулю. –
'@ stance.overview.internal_explanation', это должно быть правильным для отображения значения из соответствующего связанного обзора (если таковой имеется). но если вы используете это: '<% = render 'stance/overviews/internal', overview: @overview%>', то эта локальная переменная означает, что вы передали переменную 'overview' (которая установлена в значение, которое было ранее в переменной '@ overview' (если есть)), поэтому вы можете просто использовать это прямо так:' overview.internal_explanation', но если в '@ overview' ничего не было, то это тоже не сработает, и, возможно, вам нужно pass in: 'обзор: @ stance.overview' –
Спасибо @TarynEast - однажды я выясню, как это сделать – Mel