我有一个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 的控制台进行了一些调试,一切正常,但是在浏览器中,setter 方法在create
action之前被调用。也就是说,该记录甚至没有与之关联的用户。例如,我尝试将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