根据参数限制用户具有的列数

时间:2012-10-08 05:15:37

标签: ruby-on-rails ruby

我正在构建一个呼叫跟踪应用程序,作为学习rails和twilio的一种方式。

现在,我有模型方案计划has_many用户has_many手机。

在计划模型中,我有一个名为max_phone_numbers的参数。

我想做的是根据计划提供的max_phone_numbers来限制用户拥有的手机数量。

流程看起来像这样:

1)用户购买了一堆电话号码 2)当User.phones.count = max_phone数字时,禁用购买更多电话号码的能力,并弹出一个链接到upgrade_path

我不太确定如何做到这一点。在我的模型和控制器中我需要做什么组合?

我会在控制器中定义什么,以便在视图中我可以扭曲按钮周围的if / then语句?
即如果达到限制,则显示此项,否则显示按钮

我会在模型中添加什么来阻止某人访问该链接?

非常感谢任何有关此类事情的指导或资源

这是我当前的用户模型

# == Schema Information
#
# Table name: users
#
#  id                    :integer          not null, primary key
#  name                  :string(255)
#  email                 :string(255)
#  created_at            :datetime         not null
#  updated_at            :datetime         not null
#  password_digest       :string(255)
#  remember_token        :string(255)
#  twilio_account_sid    :string(255)
#  twilio_auth_token     :string(255)
#  plan_id               :integer
#  stripe_customer_token :string(255)
#

# Twilio authentication credentials

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation, :plan_id, :stripe_card_token
  has_secure_password
  belongs_to :plan
  has_many :phones, dependent: :destroy

  before_save { |user| user.email = email.downcase }
  before_save :create_remember_token

  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
                    uniqueness: true

  validates :password, presence: true, length: { minimum: 6 }, on: :create
  validates :password_confirmation, presence: true, on: :create
  validates_presence_of :plan_id

  attr_accessor :stripe_card_token

  def save_with_payment
    if valid?
      customer = Stripe::Customer.create(description: email, plan: plan_id, card: stripe_card_token)
      self.stripe_customer_token = customer.id
      save!
    end
  rescue Stripe::InvalidRequestError => e
    logger.error "Stripe error while creating customer: #{e.message}"
    errors.add :base, "There was a problem with your credit card."
    false
  end

    def create_twilio_subaccount     
      @client = Twilio::REST::Client.new(TWILIO_PARENT_ACCOUNT_SID, TWILIO_PARENT_ACCOUNT_TOKEN)
      @subaccount = @client.accounts.create({:FriendlyName => self[:email]})
      self.twilio_account_sid = @subaccount.sid
      self.twilio_auth_token  = @subaccount.auth_token
      save!
    end

  private

      def create_remember_token
        self.remember_token = SecureRandom.urlsafe_base64
      end


end

1 个答案:

答案 0 :(得分:3)

您可以为手机型号添加自定义验证,以检查用户是否已达到其限制。这样可以防止在用户达到限制时创建任何新手机。

在您的用户班

def at_max_phone_limit?
  self.phones.count >= self.plan.max_phone_numbers
end

在您的电话课程中

validate :check_phone_limit, :on => :create

def check_phone_limit
  if User.find(self.user_id).at_max_phone_limit?
    self.errors[:base] << "Cannot add any more phones"
  end
end

在你的视图/表单中,你会做这样的事情

<% if @user.at_max_phone_limit? %>
  <%= link_to "Upgrade your Plan", upgrade_plan_path %>
<% else %>
  # Render form/widget/control for adding a phone number
<% end %>