在创建操作之前调用setter方法

时间:2013-06-27 04:04:28

标签: ruby-on-rails ruby-on-rails-3 activerecord associations

我有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

0 个答案:

没有答案