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

CharlesZCB · 2018年09月23日 · 最后由 zouyu 回复于 2018年09月25日 · 6 次阅读

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 %>

求问大神请问怎么解决?

共收到 12 条回复

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

@customers没有赋值

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

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

def new
  @orderinfo = Orderinfo.new
  @customers  = Customer.all
  @foods = Food.all
end
Rei 回复

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

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
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

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基础教程看看

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册