我的控制器:
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
?
答案 0 :(得分:2)
问题是我没有在@campaigns
操作中设置create
实例变量。这就是选择框看起来很好但提交时出错的原因。明显!将@campaigns
添加到我的create
操作后,问题就消失了。
此外,我需要在我的edit
和update
操作中添加相同的行,因此我创建了一个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
添加到您的创建方法或编辑方法,或两者都添加。