nil的未定义方法`seasons':NilClass

时间:2017-04-29 00:12:06

标签: ruby-on-rails

我有一个问题。谁能告诉我为什么?

当我转到此链接 - localhost:3000 / serial-name 时,它会返回 -

SerialsController中的NoMethodError#show

未定义的方法`season'为nil:NilClass

我的代码

serial.rb

validates :name, presence: true, uniqueness: true

def to_param
  name.parameterize
end

has_many :seasons

season.rb

validates :season_number, presence: true, uniqueness: true, 
                          :numericality => { greater_than_or_equal_to: 1 }

belongs_to :serial

serials_controller.rb

def index
  @serials = Serial.all
end

def show
  @serial = Serial.find_by_name(params[:id])
  @seasons = @serial.seasons
end

serials_controller.rb

get '/:name', to: 'serials#show', as: :serial
root 'serials#index'

2 个答案:

答案 0 :(得分:1)

def show
  @serial = Serial.find_by!(name: params[:id])
  @seasons = @serial.seasons
end
如果无法找到记录,

find_by!将引发ActiveRecord::RecordNotFound异常。这将显示404错误页面。

但是在定义虚荣网址时,最好同时使用"漂亮的" param和id。

class Serial
  def self.find(id)
    where(id: id).or.where(name: id).first!
  end
end
def show
  @serial = Serial.find(id)
  @seasons = @serial.seasons
end

答案 1 :(得分:0)

问题在于:

@serial = Serial.find_by_name(params[:id])

您正在寻找params[:id]中的名称,但id不在params哈希中,因为您在路线中将其定义为name

get '/:name', to: 'serials#show', as: :serial

所以请改用params[:name]

@serial = Serial.find_by_name(params[:name])