Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails,Desive-防止用户更改其电子邮件地址_Ruby On Rails_Ruby On Rails 3_Devise - Fatal编程技术网

Ruby on rails Rails,Desive-防止用户更改其电子邮件地址

Ruby on rails Rails,Desive-防止用户更改其电子邮件地址,ruby-on-rails,ruby-on-rails-3,devise,Ruby On Rails,Ruby On Rails 3,Devise,当用户在我的应用程序上注册时,他们必须通过Desive+Rails 3确认他们的电子邮件 电子邮件地址定义了用户的权限,因此我不希望用户在注册后能够对其进行更改。因此删除:可以访问users.rb attr_的电子邮件,该邮件对登录用户有效,但现在用户的无法注册 正确的处理方法是什么?因此,用户不能更新他们的电子邮件,但可以使用Desive注册他们的电子邮件 谢谢我个人会让attr_可用于:email,只需从编辑视图中删除email字段。此外,您还需要在更新操作中从params散列中删除任何电子

当用户在我的应用程序上注册时,他们必须通过Desive+Rails 3确认他们的电子邮件

电子邮件地址定义了用户的权限,因此我不希望用户在注册后能够对其进行更改。因此删除:可以访问users.rb attr_的电子邮件,该邮件对登录用户有效,但现在用户的无法注册

正确的处理方法是什么?因此,用户不能更新他们的电子邮件,但可以使用Desive注册他们的电子邮件


谢谢

我个人会让attr_可用于:email,只需从编辑视图中删除email字段。此外,您还需要在更新操作中从params散列中删除任何电子邮件参数。

这是自定义验证器的最佳情况。自从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
类ImmutableValidator
属性只读:电子邮件

这很容易就解决了问题


听起来很危险。不建议这样做。如果你忘记屏蔽电子邮件字段一次,你就有一个潜在的bug或漏洞。是的,这只是一种方法,考虑到他不会在其他地方有电子邮件字段。谢谢,这个插件对Rails 3友好吗?看起来已经好几年没碰过了。我真的很喜欢你的自定义验证器的想法,看起来干净简单。你如何检查新记录?介意告诉我怎么做吗?thanks@AnApprentice你说得对,不能保证Rails3的兼容性。不管怎样,自定义验证器比以前容易多了。@AnApprentice忘记了脏属性检查。现在应该可以工作了。难道“validates:email,:on=>:update,:immutable=>true”比自定义验证器中的新记录检查更好吗?它使代码更具可读性。@acidburn2k
:on=>:update
设置是不可变的,因此要求用户提供它没有任何意义。我很乐意用稍微难看一点的实现来换取更好的API,因为实现更容易更改。