Rails undefined method `each' for nil:NilClass?这是在我提交数据的时候出的问题 具体情况如下

CharlesZCB · September 23, 2018 · Last by zouyu replied at September 25, 2018 · 3324 hits

customer 代码:

class Customer < ApplicationRecord
  validates :sex, :username, :age ,:telephone,presence: true
  has_many :orderinfos, dependent: :destroy
end

orderinfo 代码如下:

class Orderinfo < ApplicationRecord
  validates :cus_id, :foo_id, :number, presence: true
  belongs_to :customer
end

出错代码如下部分(form 部分):

<div class="field">
    <%= form.select(:cus_id) do %>
      <% @customers.each do |c| -%>   #这是在OrderInf 的显示页面   显示这里的each有问题  :undefined method `each' for nil:NilClass
        <%= content_tag(:option, c.username, value: c.id) %>
      <% end %>
    <% end %><br>
  </div>


controller部分
def create
    @orderinfo = Orderinfo.new(orderinfo_params)
    respond_to do |format|
      if @orderinfo.save    #指示这里错误并且回滚
        format.html { redirect_to @orderinfo, notice: 'Orderinfo was successfully created.' }
        format.json { render :show, status: :created, location: @orderinfo }
      else
        format.html { render :new }
        format.json { render json: @orderinfo.errors, status: :unprocessable_entity }
      end
    end
  end


提交页面如下:

<h1>New Orderinfo</h1>
<%= render 'form', orderinfo: @orderinfo  %>
<%= link_to 'Back', orderinfos_path %>

求问大神请问怎么解决?

奇怪了。。。。我把 has_many :orderinfos, dependent: :destroy,belongs_to :customer 去掉 就能添加了 着什么情况?????这样这两个类就没有关联了啊?????

@customers没有赋值

楼主你一天问了五个帖子,首页只有一个,提问要有节制。

但是不对啊 我在 orderinfo 的 new 中已经把这个对象都穿第过去了:

def new
  @orderinfo = Orderinfo.new
  @customers  = Customer.all
  @foods = Food.all
end
Reply to Rei

不好意思 刚上手这个框架 好多都在尝试中

Reply to CharlesZCB

render :new不会执行 controller 的new方法,它只是告诉 rails 接下来渲染 new 模板而已,你可以把@orderinfo以外的变量放到模板里去

我看到控制台里 所有参数都穿进 Parametes 里面了
就是在 create 的时候 有个 save 出了问题 问题就出在 has_many 和 belong_to 那个配置上 但我没有想通怎么回事

def create
    @orderinfo = Orderinfo.new(orderinfo_params)
    respond_to do |format|
      if @orderinfo.save
        format.html { redirect_to @orderinfo, notice: 'Orderinfo was successfully created.' }
        format.json { render :show, status: :created, location: @orderinfo }
      else
        format.html { render :new }
        format.json { render json: @orderinfo.errors, status: :unprocessable_entity }
      end
    end
  end
Reply to CharlesZCB

可考虑在save失败时把@orderinfo.errors打印到页面或日志上看看错在哪

你在 create 里面 render 了 new.html.erb,这个 template 需要 @customers,但是你的 create 方法里并没有提供这个变量,所以报了 NilClass

def create
    @orderinfo = Orderinfo.new(orderinfo_params)
    respond_to do |format|
      if @orderinfo.save
        format.html { redirect_to @orderinfo, notice: 'Orderinfo was successfully created.' }
        format.json { render :show, status: :created, location: @orderinfo }
      else
        @customers  = Customer.all # 提供 @customers 给 new.html.erb
        format.html { render :new }
        format.json { render json: @orderinfo.errors, status: :unprocessable_entity }
      end
    end
  end

去掉关联就能保存是因为 belongs_to 会要求 presence validated,如果 customer 并不是必须的可以指定 belongs_to :customer, optional: true

Reply to IChou

你好 我在 order 中这样修改的:

class Orderinfo < ActiveRecord::Base
  belongs_to :customer, optional: true
  validates :cus_id, :foo_id, :number, presence: true
end

因为这个订单要和顾客 customer 有关联,所以 customer 是必须的 但是问题是 我现在可以进行订单添加 删除,修改订单时汇出错:

NoMethodError in Orderinfos#edit
Showing /home/rcctp00013258/webs/testrelation/app/views/orderinfos/_form.html.erb where line #5 raised:
undefined method `each' for nil:NilClass

请问这个该咋修改?

看了你提的几个问题,都是很基础的,如果你是没有 rails 经验来维护 rails 项目的话,不妨先学习一下,至少先看一遍 guide 吧。

建议找个 ruby 基础教程看看

You need to Sign in before reply, if you don't have an account, please Sign up first.