我有一个应用,其中一个用户有很多帐户,一个帐户有一个用户。我正在尝试创建一个设置,其中客户经理可以通过输入他们的电子邮件地址从数据库添加用户,或者如果有人不是用户,则将他们添加到数据库然后添加到帐户。我想限制可以添加到每个帐户的用户数。
class Account < ActiveRecord::Base
has_many users
end
class User < ActiveRecord::Base
belongs_to account
validates_each :account do |user, attr, value|
user.errors.add attr, "too many users for account" if user.account.users.size >= 6
end
end
我在这里找到了一个很好的验证资源:Best practice for limiting the number of associations within a has_many relationship?这对于限制用户数量非常有用,但是当我尝试创建新用户(输入未知电子邮件或从正常注册路径)时,它会抛出错误
undefined method `users' for nil:NilClass
我还有一个add_user控制器来控制用户添加到帐户的方式
class AddUsersController < ApplicationController
before_action :get_user, only: [:edit, :update]
def new
end
def edit
end
def create
@user = User.find_by(email: params[:user][:email])
if @user
@user.add_user_to_account(params[:account_id])
flash[:info] = "Added User to Account"
redirect_to accounts_url
else
email = params[:user][:email]
generated_password = rand_password=('0'..'z').to_a.shuffle.first(8).join
@user = User.new(:name => "New User", :email => email, :password => generated_password, :password_confirmation => generated_password )
@user.save
@user.create_reset_digest
@user.add_user_to_account(params[:account_id])
@user.send_lab_invited_email
flash[:info] = "Email sent to user"
redirect_to accounts_url
end
end
def update
end
private
def user_params
params.require(:user).permit(:account_id, :user_id)
end
def get_user
@user = User.find_by(email: params[:email])
end
end
我认为这与用户没有帐户以及找不到帐户这一事实有关。但是大多数用户在帐户管理员分配帐户之前不会拥有帐户。任何人都可以阐明如何解决这个问题吗?我可以在模型中编写if语句,就像当前用户一样,或者可能在AddUser控制器中定义验证?
更新:
这是我的add_user_to_account方法
def add_user_to_account(account_id)
update_attributes(account_id: account_id)
end
答案 0 :(得分:0)
试试这个:
<path>
答案 1 :(得分:0)
首先,我认为您不需要validates_each
,因为您只验证了一个字段。
其次,您可以添加if
option to the validation。
所以你想要的是:
class User < ActiveRecord::Base
belongs_to account
validates :maximum_users_per_account if: :account
... Your code ...
private
def maximum_users_per_account
errors.add :account, "too many users for account" if user.account.users.count >= 6
end
end