をnew
作成するフォームがありますItem
(すべてのコードは明らかに単純化されています):
<%= simple_form_for @item do |f| %>
<%= f.input :brand_name %>
<%= f.button :submit %>
<% end %>
現在のユーザーがアイテムを作成し、それを新しいブランドまたは既存のブランドにリンクします。
このフィールドはデータベースに存在しません。すべてのモデルを関連付ける方法として使用されます。したがって、ゲッターとセッターを作成します。
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 のコンソールでデバッグを行ったところ、問題なく動作しましたが、ブラウザーではactionの前に setter メソッドが呼び出されcreate
ます。つまり、レコードにはユーザーが関連付けられていません。たとえば、メソッドを空のままにしてみ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