0

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
4

0 に答える 0