rails验证帐户模型上的用户数

时间:2016-03-09 18:12:04

标签: ruby-on-rails validation

我有一个应用,其中一个用户有很多帐户,一个帐户有一个用户。我正在尝试创建一个设置,其中客户经理可以通过输入他们的电子邮件地址从数据库添加用户,或者如果有人不是用户,则将他们添加到数据库然后添加到帐户。我想限制可以添加到每个帐户的用户数。

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 

2 个答案:

答案 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