未找到名称“用户”的关联。已经定义了吗?嵌套属性 Rails 5

Sha*_*son 1 ruby-on-rails nested-forms

使用 devise 和acts_as tennant 构建 Rails 5 应用程序。

不太确定我哪里出错了,我试图在帐户/新下以相同的形式创建帐户和帐户的所有者。

目前我收到以下错误:

/accounts/new 处的 ArgumentError 未找到名称“user”的关联。已经定义了吗?

我已经检查了我的模型和控制器,但似乎无法弄清楚这一点。

账户.rb

class Account < ApplicationRecord
  RESTRICTED_NAMES = ["www", "admin", "loadflo"]

  has_many :users

  before_validation :downcase_name, :create_account_name
  strip_attributes only: :account_name, regex: /[^[:alnum:]_-]/

  validates :user, presence: true
  validates :name, presence: true,
                   uniqueness: {case_sensitive: false},
                   exclusion: { in: RESTRICTED_NAMES, message: "This is a restricted name. Please try again or contact support." }

  accepts_nested_attributes_for :user

private

  def downcase_name
    self.name = name.try(:downcase)
  end

  def create_account_name
    self.account_name = self.name
  end

end
Run Code Online (Sandbox Code Playgroud)

账户控制器.rb

class AccountsController < ApplicationController
  before_action :set_account, only: [:show, :edit, :update, :destroy]

  def index
    @accounts = Account.all
  end

  def show

  end

  def new
    @account = Account.new
    @account.build_user
  end

  def edit

  end

  def create
    @account = Account.new(account_params)

    if @account.valid?
      @account.save
      flash[:success] = "Account created successfully."
      redirect_to new_user_session_path
    else
      render action: 'new'
    end
  end

  def update

  end

  def destroy

  end

private

  def account_params
    params.require(:account).permit(:name, user_attributes: [:email, :password, :password_confirmation, :first_name, :last_name, :mobile_tel])
  end

  def set_account
    @account = Account.find(params[:id])
  end

end
Run Code Online (Sandbox Code Playgroud)

用户.rb

class User < ApplicationRecord
  acts_as_tenant(:account)
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable, :confirmable, :trackable

end
Run Code Online (Sandbox Code Playgroud)

我还在我的用户表上设置了 account_id:integer,这样它就可以在创建时进行关联,如下所示:

add_column :users, :account_id, :integer
add_index  :users, :account_id
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助。我认为这是我忽略的一件小事。

mec*_*cov 5

你有

has_many :users
Run Code Online (Sandbox Code Playgroud)

所以你必须使用

accepts_nested_attributes_for :users
Run Code Online (Sandbox Code Playgroud)

  • 我注意到的一件事是,即使您有正确的引用名称,您也必须在“has_many”定义之后定义“accepts_nested_attributes_for” (2认同)