我有以下内容:
在parent.rb中
class Parent < ActiveRecord::Base
attr_accessor :parent_id
has_many :scouts
# Friendly ID
extend FriendlyId
friendly_id :full_name, :use => :slugged
# Synthesize fullname for use by FriendlyID
def full_name
"#{fname}-#{lname}"
end
def pretty_name
"#{fname} #{lname}"
end
end
scout.rb中的
class Scout < ActiveRecord::Base
attr_accessor :scout_id, :fname, :lname
belongs_to :parents
has_many :insignia
# Friendly ID
extend FriendlyId
friendly_id :full_name, :use => :slugged
# Synthesize fullname for use by FriendlyID
def full_name
"#{fname}-#{lname}"
end
def pretty_name
"#{fname} #{lname}"
end
end
我想获得父母所拥有的侦察兵的第一个名字,所以在parent_controller.rb我有:
def show
@parent = Parent.friendly.find(params[:id])
@id = @parent.id
@scout = Scout.where(:scout_id => @id).all
end
由于我将scout的ID存储在父模型中,因此我在id中创建了一个变量来匹配。否则,id永远不会匹配,因为在这种情况下,params [:id]是一个友好的id slug。
基本上,如何在父模型中的侦察模型上返回单个属性?例如,我想要一个id匹配给定父级的侦察兵的名字。但是当我在我看来这样做时:
<p>
<strong>Child:</strong>
<%= @scout.fname %>
</p>
我得到了
undefined method `fname' for nil:NilClass
我意识到这是非常基本的Rails,但我不常常建立像这样的多用户系统。任何有助于阐明has_many关系的帮助或信息都会受到赞赏。
答案 0 :(得分:1)
您的控制器代码存在问题:
def show
@parent = Parent.friendly.find(params[:id])
@id = @parent.id
@scout = Scout.where(:scout_id => @id).all
end
您已找到父对象并存储到@parent
。然后,您可以获取它的ID,将其存储在@id
中,然后查找所有Scout
scout_id == @id
的{{1}}(这些内容会给我所有的侦察和&#39} #39; s的ID == parent_id)。我想你在这里要做的是:
def show
@parent = Parent.friendly.find(params[:id])
@id = @parent.id
@scout = Scout.where(:parent_id => @id)
end
这可以进一步重构:
def show
@parent = Parent.friendly.find(params[:id])
@scouts = @parent.scouts
end
现在@scouts
是一个数组,因此在您的视图中,您希望使用类似#each
方法的方式遍历它。
更新
正如我们的聊天中所讨论的那样,需要先进行一些清理工作。删除Scout和Parent模型中的attr_accessor行。 Scout模型还需要belongs_to:parent而不是parent。