【问题标题】:devise invitable do not validate model设计邀请不验证模型
【发布时间】:2013-05-14 08:02:16
【问题描述】:

首先,请原谅我的英语不好,我是法国人......解释我的问题很棘手!

我在 Rails 应用程序中有一个模型用户模型:

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

第二堂课应该在邀请之前验证记录! 但是,当我使用控制台执行以下操作时:

u = BackUser.new
u.invite!

“u”被保存在数据库中,并且邀请被发送到空白电子邮件...

你知道我要做什么吗?

比很多!

【问题讨论】:

  • 你用的是什么版本?我们从1.1.8升级到devise_invitable 1.2.1后也遇到了同样的问题。所以也许这是一个向后不兼容的变化?

标签: ruby-on-rails devise devise-invitable


【解决方案1】:

我确信您现在已经找到了解决问题的方法或解决方法,但是对于遇到相同问题的任何未来 SO 用户,我找到了一个非常简单的解决方法。

Devise Invitable's model configuration docs 没有完全解释如何实现:validate_on_invite,但您必须将配置选项设置为true - :validate_on_invite =&gt; true

这是我的设计方法在我的用户模型中的样子,以使其正常工作。

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

现在,当我尝试提交邀请时,它会使用我在用户模型中设置的验证来完全验证记录,然后才允许发送邀请并创建用户记录。查看文档,我猜您也可以在设计初始化程序中启用此设置,但我还没有尝试过这条路线。

*需要时启用验证的第二个可能选项

config/initializers/devise.rb

config.validate_on_invite = true

【讨论】:

  • 尝试了这两个选项,但尚未在 Rails 4 / Invitable 1.5.5 上工作
  • 将配置放入 config/initializers/devise.rb 以使 Rails 5.2.2 正常工作。
【解决方案2】:

我从来没有能够让验证正常工作以进行设计邀请。您也不能使用 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  

【讨论】:

  • 同一条船。邀请验证对我也不起作用。
  • 使用 Rails 5 应用程序再次遇到此问题并使用此解决方案,因为我以前的解决方案似乎不适用于 Rails 4+。
【解决方案3】:

它并不能解开你的行为发生的原因,但是:

if u.save
  u.invite!
end

会给出你想要的最终结果。

【讨论】:

  • 这行不通,因为您会收到密码错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
相关资源
最近更新 更多