Rails 4 has_many:通过NoMethodError

时间:2013-11-10 12:58:19

标签: ruby-on-rails ruby-on-rails-4

这可能是一个简单的解决方案,但我很难过。

我想显示一个表格: 活动名称| EventAthlete结果| EventAthlete得分

如果我检查pry控制台中的数据,一切都正确链接。 例如。 @athlete.event_athletes.first.event.name 这将返回事件的正确名称。

但是,当我尝试在浏览器中显示数据时(即ea.event.name),我收到错误:

“/ Athle / 1的NoMethodError” 未命名的方法`name'代表nil:NilClass“

我怀疑这可能是强参数的问题。

https://github.com/thaczuk/scoring/tree/eventScoring 请指教。

模型

class Athlete < ActiveRecord::Base
  belongs_to  :competition
  belongs_to  :competition_category
  has_many    :event_athletes
  has_many    :events, through: :event_athletes
end

class Event < ActiveRecord::Base
  belongs_to  :competition
  has_many    :event_athletes
  has_many    :athletes, through: :event_athletes
end

class EventAthlete < ActiveRecord::Base
  belongs_to  :athlete
  belongs_to  :event
end

控制器

class AthletesController < ApplicationController

  ...

  def show
    @athlete = Athlete.find(params[:id])
    binding.pry
  end

  ...

private
    def athlete_params
      params.require(:athlete).permit(:firstname, :lastname, :gender, :competition_id, :competition_category_id)
    end
end

查看

%div
  %table.table
    %thead
      %tr
        %th(width="30%") Event
        %th Result
        %th Score

    %tbody
      -@athlete.event_athletes.each do |ea|
        %tr
          %td= ea.event.name
          %td= ea.result
          %td= ea.score

1 个答案:

答案 0 :(得分:0)

此处的每条记录都有一位运动员和一项赛事@athlete.event_athletes.each

Yout只想循环所有事件而不是循环所有事件 - 运动员。

您想要做的是:

@athelete.events.each do |event|
     %td= event.name
     % ea = EventAthlete.where(athlete_id: @athelte.id, event_id: event.id)
     %td= ea.score
     %td= ea.result