2015-01-14 4 views
0

У меня есть следующие:Rails 4 has_many вопрос

в 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 

Поскольку я храню идентификатор разведчика в родительской модели, я сделал переменную из идентификатора, чтобы она соответствовала. В противном случае идентификатор никогда не будет соответствовать, потому что в этом случае params [: id] является дружественным id slug.

Как я могу вернуть отдельные атрибуты в модели скаутов внутри родительской модели? Например, я хочу получить первое имя разведчика, чей идентификатор совпадает с данным родителем. Но когда я делаю это, на мой взгляд:

<p> 
    <strong>Child:</strong> 
    <%= @scout.fname %> 
</p> 

Я получаю

undefined method `fname' for nil:NilClass 

Я понимаю, что это довольно элементарные Rails, но это не так часто, что я строю многопользовательских систем, как это. Любая помощь или информация, которые могут пролить свет на отношения has_many, оценены.

ответ

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 (который читает, чтобы дать мне все идентификаторы разведчика, кто является 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.

Update:

Как обсуждалось в нашем чате есть немного чистой вверх, что должно произойти в первую очередь. Удалите строки attr_accessor как в модели Scout, так и в Parent. Кроме того, для модели Scout требуется принадлежность role_to: parent, а не родители.

+0

Не повезло. Нет ошибки, но в представлении ничего не возвращается. Я знаю, что есть соответствующая запись, поэтому мне нужно вернуть имя. – nickmjones

+0

Каждый метод также не получает меня. <% @ scouts.each do | s | %> <% = s.fname%> <% end -%> – nickmjones

+0

ID родителя здесь равен 1. – nickmjones