0

我有一个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 方法在createaction之前被调用。也就是说,该记录甚至没有与之关联的用户。例如,我尝试将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
4

0 回答 0