0

サイトに招待状を使用しようとしています。私はそれを知りたいです; 私の最初のユーザーは招待状を必要としませんか? どうすれば例外を作ることができますか? 推測できますが、レスキュー例外を使用する必要がありますが、どこで実行する必要があるかわかりませんか? 私の users.rb モデル:

class User < ActiveRecord::Base
  attr_accessible :nickname, :email, :password, :password_confirmation, :invitation_token
  has_secure_password
  has_many :friendships
    has_many :friends, :through => :friendships
    has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
    has_many :inverse_friends, :through => :inverse_friendships, :source => :user

  has_many :topics, dependent: :destroy
  has_many :posts, dependent: :destroy

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

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

    validates :password, presence: true, length: { minimum: 6 }
  validates :password_confirmation, presence: true

    validates_presence_of :invitation_id, :message => 'gerekli'
    validates_uniqueness_of :invitation_id
    has_many :sent_invitations, :class_name => 'Invitation', :foreign_key => 'sender_id'
    belongs_to :invitation

    before_create :set_invitation_limit

    def invitation_token
        invitation.token if invitation
    end

    def invitation_token=(token)
        self.invitation = Invitation.find_by_token(token)
    end

    private

    def create_remember_token
        self.remember_token = SecureRandom.urlsafe_base64
    end

    def set_invitation_limit
        self.invitation_limit = 5
    end
end

そして、これは users_controller.rb です:

def new
  @user = User.new(:invitation_token => params[:invitation_token])
  @user.email = @user.invitation.recipient_email if @user.invitation
end

   def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      flash[:success] = "Giripedia'ya hoşgeldiniz'!"
      redirect_to @user
    else
      render 'new'
    end
  end
4

2 に答える 2

2

条件付き検証を行います。簡単な例を挙げましょう。

class User
  # ...
  validates_presence_of :invitation_id, :if => :invitation_needed?

  # An invitation is needed if there is at least one user. If there
  # are no users, there can't be an invitation.
  def invitation_needed?
    User.all.count >= 1
  end
end

詳細:条件付き検証に関するマニュアルを参照してください

于 2012-07-02T12:52:54.853 に答える
1

最初のユーザーを保存できるようにするためだけに条件付き検証を作成するのが良い考えかどうかはわかりません。

ユーザーを検証するたびにカウント クエリを実行する必要はありません。

検証をスキップするオプションを使用して、コンソールから最初のユーザーを保存できます。

@user.save(:validate => false)
于 2012-07-02T20:31:26.280 に答える