8

まず、英語が下手で申し訳ありません。私はフランス人です...私の問題を説明するのは難しいです!

Rails アプリケーションにモデル User モデルがあります。

class User < ActiveRecord::Base

  attr_accessible :email, :gender, :lastname, :firstname    

end

User から継承する BackUser モデル:

class BackUser < User
  # Class for Backoffice User
  devise :database_authenticatable, 
          :rememberable, 
          :trackable, 
          :lockable, 
          :invitable, 
          :confirmable,
          :validatable,
          :validate_on_invite => true

  attr_accessible :password, :password_confirmation, :remember_me, :active, :role

  validates :role, presence: true,
                  inclusion: ["admin", "normal"]

  validates :gender, presence: true

  validates :firstname, presence: true

  validates :lastname, presence: true


  def admin?
    self.role == 'admin'
  end

end

この 2 番目のクラスは、招待する前にレコードを検証する必要があります。しかし、コンソールを使用して次のことを行うと:

u = BackUser.new
u.invite!

「u」はデータベースに保存され、招待状は空メールに送信されます...

私がしなければならないことを知っていますか?

どうも!

4

3 に答える 3

23

今までに問題の解決策または回避策を見つけたと確信していますが、同じ問題に遭遇する将来のSOユーザーのために、非常に簡単な修正を見つけました.

Devise Invitable のモデル構成ドキュメントでは、実装方法が完全には説明されて:validate_on_inviteいませんが、構成オプションをtrue-に設定する必要があります:validate_on_invite => true

これが正しく機能するために、私のユーザーモデルで私のdeviseメソッドがどのように見えるかを次に示します。

models/user.rb

# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :invitable, :database_authenticatable, :registerable,
       :recoverable, :rememberable, :trackable, :validatable, :validate_on_invite => true

招待状を送信しようとすると、招待状の送信とユーザー レコードの作成を許可する前に、User モデルで設定した検証でレコードが完全に検証されます。ドキュメントを見ると、デバイス初期化子でこの設定を有効にすることもできると思いますが、そのルートを試したことはありません。

*必要に応じて検証を有効にする 2 番目のオプション

config/initializers/devise.rb

config.validate_on_invite = true
于 2014-02-17T22:01:37.000 に答える
5

私はdevise invitableの検証を正しく機能させることができませんでした。パスワードの検証エラーが発生するため、RobHeaton の提案も使用できません。この小さなハックを使用して、検証を機能させます。

  def create
    @user = User.new(user_params)
    @user.valid?
    @user.errors.messages.except!(:password) #remove password from errors
    if (@user.errors.any?)
      render 'new'
    else
      @user.invite!(current_user)
      redirect_to user_path(@user)
    end
  end  
于 2015-08-16T21:22:15.643 に答える
-1

なぜあなたの行動が起こっているのかという謎は解決しませんが、

if u.save
  u.invite!
end

あなたが求めている最終結果が得られます。

于 2013-05-14T17:04:46.940 に答える