Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.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 3模型中保存之前调用的方法的上下文是什么?_Ruby On Rails_Activerecord_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 在Rails 3模型中保存之前调用的方法的上下文是什么?

Ruby on rails 在Rails 3模型中保存之前调用的方法的上下文是什么?,ruby-on-rails,activerecord,ruby-on-rails-3,Ruby On Rails,Activerecord,Ruby On Rails 3,老实说,我不知道用其他的方式来称呼这件事(或者实际寻找什么) 因此,在我的ActiveRecord(…app/model/s/account.rb/)中,我有以下内容: validates :username, :password, :email, :presence => true validates :username, :email, :uniqueness => true validates :username, :length => { :within => 5

老实说,我不知道用其他的方式来称呼这件事(或者实际寻找什么)

因此,在我的ActiveRecord(…app/model/s/account.rb/)中,我有以下内容:

validates :username, :password, :email, :presence => true
validates :username, :email, :uniqueness => true
validates :username, :length => { :within => 5..30}
validates :password, :length => { :within => 6..128}
validates :password, :confirmation => true
validates :email, :format => { :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i }
before_save :encrypt_password

private

    def encrypt_password
        require "digest"
        @account.password = Digest::SHA1.hexdigest(@account.password)
    end
我得到了一个错误:

nil:NilClass的未定义方法“password”

为什么它将
@account
报告为零?嗯,可能是因为@account不存在于视图/控制器之外,但我(老实说)想不出任何其他方法来实现这一点

附言:我试着把
加密密码
放在控制器里面;它仍然不起作用(尽管有不同的错误)。

您应该试试

 def self.hash_password(password = '')
      self.password = Digest::SHA1.hexdigest(password)
 end
你应该试试

 def self.hash_password(password = '')
      self.password = Digest::SHA1.hexdigest(password)
 end

将方法更改为:

def encrypt_password
  require 'digest'
  self.password = Digest::SHA1.hexdigest(self.password)
end
您在控制器和视图中使用的实例变量@account引用类account的实例,这就是您在该文件中处理的对象。那么,你大概在控制器中做了这样的事情:

@account = Account.new(params)
@account.save!
类帐户的实例收到“保存!”调用并激发它的before_save回调,在此回调中,它需要将自身称为“self”,而不是@account(您的控制器为其命名)


旁注:您应该在类文件的顶部而不是在方法内部要求使用“摘要”-无需每次要散列密码时都加载摘要库。

将方法更改为:

def encrypt_password
  require 'digest'
  self.password = Digest::SHA1.hexdigest(self.password)
end
您在控制器和视图中使用的实例变量@account引用类account的实例,这就是您在该文件中处理的对象。那么,你大概在控制器中做了这样的事情:

@account = Account.new(params)
@account.save!
类帐户的实例收到“保存!”调用并激发它的before_save回调,在此回调中,它需要将自身称为“self”,而不是@account(您的控制器为其命名)


旁注:您应该在类文件的顶部而不是在方法内部要求“摘要”-没有必要每次都加载摘要库来散列密码。

您是否尝试过使用“:password”?是的。这个也失败了。(语法错误,意外的“=”,应为关键字_end)尝试从提交数据的“表单”创建帐户变量。ie:-@account=account.new(params[:userform])@Stephen-那个不起作用(@Harry-我已经有了,但那个在控制器里。一切都很好,我甚至可以将它存储到数据库中,唯一不起作用的是将密码以加密形式存储。试试self.password…看:你试过使用“:password”吗?是的。那个也失败了。(语法错误,意外“=”,应为关键字_end)尝试从提交数据的“表单”中创建帐户变量。即:-@account=account.new(params[:userform])@Stephen-该变量无效!:(@Harry-我已经有了,但那个在控制器里。而且一切都很好,我甚至可以将它存储到数据库中,唯一不起作用的是将密码以加密形式存储。试试self.password…请注意:你不必在方法中用“self”作为密码前缀,我只是觉得更清楚地解释一下顺便说一句。啊,我可以吻你!谢谢!:)注意,你不必在密码前面加上“self”的前缀,我只是觉得这样解释更清楚。啊,我可以吻你!谢谢!:)