NoMethodError(nil的未定义方法`map':NilClass

时间:2016-06-16 09:33:11

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

亲爱的铁路程序员,

我在collection_select form_tag上遇到了一个小问题 我正在研究的项目包含3个独立的主要模型: 顾客, 拥有者, 地址。

一个客户可以拥有多个所有者和地址,而每个地址都可以分配一个所有者

我面临的问题是我似乎无法指定所有者来解决问题

在我的地址控制器new.html.erb

<%= form_for(@address) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <%= hidden_field_tag :id, @customer.id %>

  <%= f.label :name %>
  <%= f.text_field :name, class: 'form-control' %>

  <%= f.label :unit %>
  <%= f.text_field :unit, class: 'form-control' %>

  <%= f.label :tel %>
  <%= f.text_field :tel, class: 'form-control' %>

  <%= f.label :working_hours %>
  <%= f.time_select :start_at, {minute_step: 30} %> to 
  <%= f.time_select :end_at, {minute_step: 30} %>

  <%= f.label :owner_id %>
  <%= f.collection_select :owner_id, @owners, :id, :name, {include_blank: 'Please Select'},%>
.
.
.
<%= f.submit "Add new address", class: "btn btn-primary" %>
<% end %>

在address.rb

def new
  @address = Address.new
  @customer = Customer.find(params[:id])
  @owners = Owner.find_by(customer_id: params[:id])
end

我正面临一个错误:

  

NoMethodError(nil的未定义方法`map':NilClass   你的意思是?抽头):

上面的代码..但是当我替换

@owners = Owner.find_by(customer_id: params[:id])

@owners = Owner.all

此页面将加载,选择保管箱将允许我在我的所有者表中选择所有拥有者..我只想搜索拥有customer_id = params [:id]的所有者..

P.S - 地址和所有者表都有customer_id列和address.rb has_many:所有者和owner.rb belongs_to:地址

任何人都可以帮助我吗?谢谢,并且非常了解。

2 个答案:

答案 0 :(得分:1)

Owner.find_by最多返回一个记录。而你需要一个集合。请改用:

@owners = Owner.where(customer_id: @customer.id)

答案 1 :(得分:1)

find_by返回单个记录或为零。这两个对象都不支持map。这就是您看到错误消息的原因。

您应该使用where

@owners = Owner.where(customer_id: @customer.id)