2016-10-27 4 views
0

Я пытаюсь узнать, как использовать пространства имен в моем приложении 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 

Может ли кто-нибудь ссылаться на материалы, чтобы помочь мне узнать, как использовать пространства имен в моем приложении. Я пытаюсь понять основы этого, чтобы я мог накопить некоторые знания. Я нахожу вещи посредством проб и ошибок, но не понимаю, что на самом деле требуется (хотя в этом случае ни одна из моих попыток не работает).

+0

где вы устанавливаете '@ overview'? Похоже, что во время работы он равен нулю. –

+0

'@ stance.overview.internal_explanation', это должно быть правильным для отображения значения из соответствующего связанного обзора (если таковой имеется). но если вы используете это: '<% = render 'stance/overviews/internal', overview: @overview%>', то эта локальная переменная означает, что вы передали переменную 'overview' (которая установлена ​​в значение, которое было ранее в переменной '@ overview' (если есть)), поэтому вы можете просто использовать это прямо так:' overview.internal_explanation', но если в '@ overview' ничего не было, то это тоже не сработает, и, возможно, вам нужно pass in: 'обзор: @ stance.overview' –

+0

Спасибо @TarynEast - однажды я выясню, как это сделать – Mel

ответ

1

Для доступа к Overview модель (таблица), когда вы работаете не в Stance пространства имен, вы должны использовать Stance::Overview. Если вы работаете, например, в контроллере, который в домене Stance вы можете использовать только Overview для доступа.

Для того, чтобы получить доступ по ссылке, вам не нужны никакие дополнительные нотации @organisation.overview.

Если я правильно понял в вас случае, если вы должны объявить частичную, как

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

и парциальное вы должны использовать overview без @.

Смежные вопросы