0

我有以下错误

undefined method `[]' for nil:NilClass
app/controllers/events_controller.rb:60:in `create'

在这种情况下,我不确定他们所说的 nil 是什么意思。这里我的控制器和第 60 行是箭头所在的位置

def create
    @event = current_customer.events.build(params[:event])
    @location = @event.locations.build(params[:location])
    --->@location.longitude = params[:location][:longitude]
    @location.latitude = params[:location][:latitude]
    respond_to do |format|
    if @location.save
        if @event.save
            format.html { redirect_to @event, notice: 'Event was successfully created.' }
            format.json { render json: @event, status: :created, location: @event }
          else
            format.html { render action: "new" }
            format.json { render json: @event.errors, status: :unprocessable_entity }
        end
      end
    end
  end

我有两个模型一个事件和一个位置,我同时创建两个事件并且事件有很多位置。经度是 attr_accesor 经度和纬度。隐藏字段类型。

4

3 回答 3

2

要么params是零,要么更可能params[:location]是零。

想象:

a = [[1,2], [3,4], [5,6], nil, [7,8]]
a[0][0]
=> 1
a[3][0]
undefined method `[]' for nil:NilClass

因为第四个元素是 nil,所以我们不能使用[]它上面的方法..

结论是params[:location]nil,因此当您尝试访问您认为是数组的元素时,您会收到方法错误,因为NilClass没有[]方法(而Array 有

于 2013-01-01T23:16:11.537 回答
2

params[:location]很有可能nil。此外,您应该考虑使用嵌套模型表单来获得更简洁的代码。请参阅嵌套模型表单上的RailsCast.fields_for

从理论上讲,您的模型类应该如下所示:

class Customer < ActiveRecord::Base
    ...
    has_many :events
    accepts_nested_attributes_for :events
    ...
end

class Event < ActiveRecord::Base
    ...
    has_one :location
    accepts_nested_attributes_for :location
    ...
end

class Location < ActiveRecord::Base
    ...
    belongs_to :event
    ...
end

你的控制器是这样的:

class EventsController < ApplicationController
    def new
        current_customer.events.build({}, {}) # instantiate 2 empty events            
    end

    def create
        current_customer.events.build(params[:event])
        if current_customer.save # should save all events and their associated location
            ...
        end
    end
end

你的观点是这样的:

<%= form_for @customer do |f| %>
    ...
    <%= f.fields_for :events do |e| %>
        ...
        <%= e.fields_for :location, (e.build_location || e.location) do |l| %>
            <%= l.hidden_field :longitude %>
            <%= l.hidden_field :latitude %>
        <% end %>
        ...
    <% end %>
    ...
<% end %>
于 2013-01-01T23:54:52.797 回答
0

写入您的控制台:

logger.debug params[:location].class
logger.debug params[:location].inspect

我怀疑即将到来的数据不是您所期望的(即 [:longitude] 不是散列参数 [:location] 的一部分)。

于 2013-01-01T23:16:58.727 回答