【问题标题】:Rails, DEVISE - Preventing a user from changing their email addressRails, DEVISE - 防止用户更改他们的电子邮件地址
【发布时间】:2011-05-10 14:05:56
【问题描述】:

当用户在我的应用上注册时,他们必须确认他们的电子邮件,由 Devise + Rails 3 提供支持。

电子邮件地址定义了用户的权限,因此我不希望用户在注册后就能够更改它。因此从 users.rb attr_accessible 中删除了 :email,它适用于登录用户,但现在用户无法注册。

处理这个问题的正确方法是什么?因此用户无法更新他们的电子邮件,但可以使用 devise 注册他们的电子邮件。

谢谢

【问题讨论】:

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


    【解决方案1】:

    这是自定义验证器的完美案例。从 Rails3 开始,它们比以前容易得多。

    class ImmutableValidator < ActiveModel::EachValidator
      def validate_each(record, attribute, value)
        record.errors[attribute] << "cannot be changed after creation" if record.send("#{attribute}_changed?") && !record.new_record?
      end
    end
    
    class User < ActiveRecord::Base
      validates :email, :immutable => true
    end
    

    【讨论】:

    • 谢谢,那个插件 Rails 3 友好吗?好像很多年都没有动过。我真的很喜欢你的自定义验证器想法,看起来干净简单。你如何检查new_record?介意展示如何做到这一点?谢谢
    • @AnApprentice 你是对的,不能保证 Rails3 的兼容性。无论如何,自定义验证器比以前容易多了。
    • @AnApprentice 忘记了脏属性检查。现在应该可以工作了。
    • “验证 :email, :on => :update, :immutable => true” 是否比自定义验证器中的 new_record 检查更好?它使代码更具可读性。
    • @acidburn2k :on =&gt; :update 设置隐含在它不可变的事实中,因此要求用户提供它没有任何意义。我很乐意用更丑的实现来换取更好的 API,因为实现更容易更改。
    【解决方案2】:

    attr_readonly :email

    这很容易解决问题。

    https://groups.google.com/forum/#!topic/plataformatec-devise/skCarCHr0p8

    【讨论】:

      【解决方案3】:

      我会亲自将 attr_accessible 保留为 :email,然后从编辑视图中删除电子邮件字段。此外,您还需要在更新操作中从 params 哈希中删除任何电子邮件参数。

      【讨论】:

      • 听起来很危险。
      • 不推荐。如果您忘记屏蔽电子邮件字段一次,您就有潜在的错误或漏洞利用。
      • 是的,考虑到他不会在其他任何地方拥有电子邮件字段,这只是一种方法。
      猜你喜欢
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 2020-01-15
      • 2018-10-19
      • 2016-09-26
      相关资源
      最近更新 更多