Rails - 如何在视图

时间:2016-10-27 22:22:38

标签: ruby-on-rails ruby namespaces nested-attributes

我正在尝试学习如何在我的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

任何人都可以向我推荐材料,以帮助我学习如何在我的应用中使用命名空间。我试图理解这个的基本原理,以便我可以提供一些知识。我通过反复试验找到了一些东西但却没有理解实际需要的东西(尽管在这种情况下,我的尝试都没有成功)。

1 个答案:

答案 0 :(得分:1)

要在Overview名称空间中工作时访问Stance模型(表格),您必须使用Stance::Overview。如果在Stance命名空间中的控制器中工作,则只能使用Overview进行访问。

要从关系中获取权限,您只需@organisation.overview

即可添加任何其他表示法

如果我在你的情况下理解正确,你必须声明你的部分为

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

在部分内容中,您必须使用overview而不使用@