【问题标题】:undefined method `[]' for nil:NilClassnil:NilClass 的未定义方法“[]”
【发布时间】:2013-08-08 05:31:07
【问题描述】:

定义创建

(1..params[:book_detail][:no_of_copies].to_i).each do |i|

  logger.info "nnnnnnnnnnn#{i}"
  @book_details= BookDetail.new(params[:book_detail])
  @book_details.save
end

错误是 未定义的方法[]' for nil:NilClass app/controllers/book_details_controller.rb:16:increation'

有人能说出问题所在吗?

【问题讨论】:

  • 你能在创作中打印 params[:book_detail] 吗?
  • 错误信息很清楚 -- paramsparams[:book_detail]nil

标签: ruby-on-rails


【解决方案1】:

你得到的错误是因为 params[:book_detail]nil 并且你在它上面调用 [:no_of_copies] 即 nil。所以它给出了以下错误

 undefined method []' for nil:NilClass 

所以您需要先检查params[:book_detail] 是否存在,如下所示

(1..params[:book_detail][:no_of_copies].to_i).each do |i|    
  logger.info "nnnnnnnnnnn#{i}"
  @book_details= BookDetail.new(params[:book_detail])
  @book_details.save
end if params[:book_detail] && params[:book_detail][:no_of_copies]

【讨论】:

  • 正如@Dogbert 在 cmets 中所说,params 也可以为 nil
  • @Baboon 我不这么认为。除非您明确将参数设置为 nil,否则在控制器中它将始终包含一些值
【解决方案2】:

另外是Salil的回答,可以用fetch

params.fetch(:book_detail, {})[:no_of_copies]

如果params[:book_detail]nil,它将返回nil(1..0).to_a 返回一个空数组,因此您可以使用以下代码重写您的代码

copies = (params.fetch(:book_detail, {})[:no_of_copies] || 0).to_i

(1..copies).each do |i|    
  logger.info "nnnnnnnnnnn#{i}"
  @book_details= BookDetail.new(params[:book_detail])
  @book_details.save
end

【讨论】:

    猜你喜欢
    • 2011-07-27
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多