簡體   English   中英

rails has_many通過多個模型-nil:class沒有方法

[英]rails has_many through for multiple models - no method for nil:class

我有財產,居民和人的模型(城市以外的人必須不是居民),然后我有所有者聯接表,在這里設置財產是屬於居民還是人

這是我的模特

class Property < ActiveRecord::Base
    has_many :owners, dependent: :destroy
    has_many :residents, through: :owners
    has_many :people, through: :owners
    belongs_to :ptype
end

class Resident < ActiveRecord::Base
    has_many :owners, dependent: :destroy 
    has_many :properties, through: :owners
end

class Person < ActiveRecord::Base
    has_many :owners, dependent: :destroy 
    has_many :properties, through: :owners
end

class Owner < ActiveRecord::Base
    belongs_to :resident
    belongs_to :property
    belongs_to :person
end

我想查看顯示關系的位置,以便owner.resident顯示屬性或owner.person顯示屬性

 <% if @owner.resident %>
  <ol><% @residents.properties.each do |property| %>
            <li><%= property.ptype.name %> , <%= property.address %></li>
          <% end %> 
</ol>
<% end %>

<% if @owner.person %>
<ol><% @people.properties.each do |property| %>
            <li><%= property.ptype.name %> , <%= property.address %></li>
            <% end %> 
</ol><% end %>

當我想顯示所有者是居民的關系時,我得到@people的nil:class的錯誤無方法屬性,而當我想顯示所有者是我的人的關系時,nil:class的無方法屬性錯誤。 @residents

我了解這是因為它不返回任何記錄,但這就是為什么我將其放在

我究竟做錯了什么?

編輯:我使用由rails生成的默認控制器

class PeopleController < ApplicationController
  before_action :set_person, only: [:show, :edit, :update, :destroy]

  def index
    @people = Person.all
  end

  def show
  end

  def new
    @person = Person.new
  end

  def edit
  end

  def create
    @person = Person.new(person_params)
    respond_to do |format|
      if @person.save
        format.html { redirect_to @person, notice: 'Person was successfully created.' }
        format.json { render :show, status: :created, location: @person }
      else
        format.html { render :new }
        format.json { render json: @person.errors, status: :unprocessable_entity }
      end
    end
  end

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

  def destroy
    @person.destroy
    respond_to do |format|
      format.html { redirect_to people_url, notice: 'Person was successfully destroyed.' }
      format.json { head :no_content }
    end
  end
  private

    def set_person
      @person = Person.find(params[:id])
    end

    def person_params
      params.require(:person).permit(:name, :email, :tel)
    end
end

class ResidentsController < ApplicationController
  before_action :set_resident, only: [:show, :edit, :update, :destroy]
  def index
    @residents = Resident.all
  end

  def show
    @residents = Resident.find(params[:id])
  end

  def new
    @resident = Resident.new
  end

  def edit
  end

  def create
    @resident = Resident.new(resident_params)
    respond_to do |format|
      if @resident.save
        format.html { redirect_to @resident, notice: 'Záznam bol úspešne vytvorený.' }
        format.json { render :show, status: :created, location: @resident }
      else
        format.html { render :new }
        format.json { render json: @resident.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @resident.update(resident_params)
        format.html { redirect_to @resident, notice: 'Záznam bol úspešne upravený.' }
        format.json { render :show, status: :ok, location: @resident }
      else
        format.html { render :edit }
        format.json { render json: @resident.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @resident.destroy
    respond_to do |format|
      format.html { redirect_to residents_url, notice: 'Záznam bol úspešne zmazaný.' }
      format.json { head :no_content }
    end
  end
  private

    def set_resident
      @resident = Resident.find(params[:id])
    end
    def resident_params
      params.require(:resident).permit(:name, :birthdate, :birthId, :address, :email, :tel)
    end
end

好的,我從一開始就做錯了這是一個解決方案

<% if @owner.resident.present? %>
  <ol><% @owner.resident.properties.each do |property| %>
            <li><%= property.ptype.name %> , <%= property.address %></li>
          <% end %> 
</ol>
<% end %>
<% if @owner.person.present? %>
<ol><% @owner.person.properties.each do |property| %>
            <li><%= property.ptype.name %> , <%= property.address %></li>
          <% end %> 
</ol>
<% end %>

IIRC @owner.person@owner.resident將返回代理對象,直到完成某些操作為止–嘗試@owner.person.present? @owner.resident.present?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM