Rails undefined方法`map' for nil:NilClass - form collection_select

时间:2015-07-30 21:15:43

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

我的控制器:

def new
  @campaigns = current_user.business.campaigns

  # Calling @campaigns from the controller and view (using the byebug gem) shows:
  # #<ActiveRecord::Associations::CollectionProxy [#<Campaign id: 1, title: "My Campaign">]>

  # So it IS getting loaded in the controller and view.
end

我的表格:

<%= f.collection_select :campaign_id, @campaigns, :id, :title %>

广告系列正在选择框中显示

我提交表单时出现的错误(在我的表单上方显示的行上):

undefined method `map' for nil:NilClass

但是,如果我将collection_select更改为此错误,则不会出现错误:

<%= f.collection_select :campaign_id, Campaign.all, :id, :title %>
<!-- Notice the "Campaign.all" above -->

至于我的模型:user有一个business has_many campaigns(irrelevant model)

我错过了什么?是因为它返回CollectionProxy

2 个答案:

答案 0 :(得分:2)

问题是我没有在@campaigns操作中设置create实例变量。这就是选择框看起来很好但提交时出错的原因。明显!将@campaigns添加到我的create操作后,问题就消失了。

此外,我需要在我的editupdate操作中添加相同的行,因此我创建了一个before_action来保持干净。

class MyController < ApplicationController
  before_action :set_select_collections, only: [:edit, :update, :new, :create]

  private
    def set_select_collections
      @campaigns = current_user.business.campaigns
    end
end

答案 1 :(得分:0)

这将会发生,因为当您在@campaigns方法中正确创建new对象时,您会发布到另一个再次呈现页面的方法(很可能是create)(可能会重定向到edit或呈现new),但在该方法中您不会重新创建@campaigns对象,因此无法使用观点。

@campaigns = current_user.business.campaigns添加到您的创建方法或编辑方法,或两者​​都添加。