Как мне ограничить количество клиентов, которые пользователь может добавить в Rails 3? - PullRequest
0 голосов
/ 18 февраля 2011

По сути, я хочу, чтобы каждый пользователь («дизайнер») мог добавлять только количество клиентов, ограниченных их планом.Поэтому, если их план разрешает только 1 клиента, это все, что они могут сделать.

Моя модель пользователя выглядит следующим образом:

class User < ActiveRecord::Base
  devise :database_authenticatable, :confirmable, :registerable, :timeoutable,
         :recoverable, :rememberable, :trackable, :validatable, :invitable

  has_many :clients,
           :through => :client_ownerships,
           :order => 'created_at DESC'

{edited for brevity}

end

Модель клиента выглядит следующим образом:

class Client < ActiveRecord::Base
    before_save :number_of_clients  
    belongs_to :user

  has_many :projects, :order => 'created_at DESC', :dependent => :destroy

  has_one :ownership, :dependent => :destroy

  has_one :designer, :through => :ownership
  validates :name, :presence => true,
                   :length => {:minimum => 1, :maximum => 128}

  def number_of_clients
     Authorization.current_user.clients.count < Authorization.current_user.plan.num_of_clients    
  end

end

Модель плана выглядит следующим образом:

# == Schema Information
# Schema version: 20110214082231
#
# Table name: plans
#
#  id              :integer         not null, primary key
#  name            :string(255)
#  storage         :float
#  num_of_projects :integer
#  num_of_clients  :integer
#  cached_slug     :string(255)
#  created_at      :datetime
#  updated_at      :datetime
#  price           :integer
#

class Plan < ActiveRecord::Base

  has_many :users
  has_friendly_id :name, :use_slug => true

end

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Вместо того, чтобы ваш number_of_clients метод вызывался с обратным вызовом before_save, используйте вместо этого обратный вызов проверки:

# app/models/client.rb
validate :is_within_plan_limits

def is_within_plan_limits
   errors.add(:client, 'You cannot add another client') if user.max_clients?
end

# app/models/user.rb
def max_clients?
  Authorization.current_user.clients.count > Authorization.current_user.plan.num_of_clients
end

# app/controllers/client_controller.rb
def new
  redirect_to(some_path, :notice => 'Time to upgrade') and return if current_user.max_clients?
end

См. Документы по этому здесь .

Вы можете проверить количество клиентов в вашем контроллере с помощью нового действия, чтобы убедиться, что у пользователя есть свободный клиентский слот, и направить его на обновление, если нет.Эта проверка будет просто приводить в исполнение этот пользовательский интерфейс.

1 голос
/ 18 февраля 2011

Можете ли вы просто добавить пользовательскую проверку к атрибуту?

Что-то вроде:

validate_on_create :within_client_limit

def within_client_limit
  errors.add("Client limit exceeded") if client.length > current_user.plan.client_limit
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...