我有new
表单,可以创建Item
(所有代码都明显简化了):
<%= simple_form_for @item do |f| %>
<%= f.input :brand_name %>
<%= f.button :submit %>
<% end %>
当前用户将创建一个项目并将其链接到新品牌或现有品牌。
该字段在数据库中不存在;它将被用作关联所有模型的方式。因此,我创建了它的getter和setter。
def Item < ActiveRecord::Base
belongs_to :user
belongs_to :brand
attr_accessible :brand_name
def brand_name
brand.try :name
end
def brand_name=(name)
if name.present?
brand = user.brands.find_or_initialize_by_name(name)
brand if brand.save
end
end
end
class ItemsController < ApplicationController
def new
@item = current_user.items.build
end
def create
@item = current_user.items.build(params[:item])
if @item.save
...
end
end
end
问题是,在提交表单时,我收到此错误,该错误位于product_name=()
方法中。我已经通过Rails的控制台进行了一些调试,但一切都很好,但在浏览器中,在create
操作之前调用了setter方法。也就是说,记录甚至没有与之关联的用户。例如,我尝试将create
方法留空,但没有任何不同。
undefined method `brands' for nil:NilClass
真正奇怪的是,这是几个星期前的工作(我检查了我的git提交,代码是相同的)。
我虽然打电话给before_create
回调,但是无法知道应该关联哪个用户。
更新
我正在使用Sorcery作为身份验证处理程序。除了这个创建动作之外,一切都能正常工作。
class User < ActiveRecord::Base
authenticates_with_sorcery!
belongs_to :company
has_many :items
end
class Company < ActiveRecord::Base
has_many :users, dependent: :destroy
has_many :brands, dependent: :destroy
end