[英]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.