Rails sha1哈希生成器

时间:2013-09-18 14:46:18

标签: ruby-on-rails hash sha1 digest

希望有人可以帮助我。我现在有点卡住了。我正在尝试为跟踪系统创建一个应用程序,我目前有一个名为sdel_hashed的表。在线视频之后,我到目前为止已经将digest / sha1设置为部分工作。如果我在控制台中输入以下命令:

sdel = Sdel.find(1)
sdel.hashed_sdel = Sdel.hash('secret')
sdel.save

然后在浏览器中查看它显示为哈希而不是秘密的记录,但如果我尝试通过新操作输入单词secret,则不会进行哈希处理。我认为创建动作中可能缺少某些内容,但我无法在任何地方找到答案。我非常感谢任何帮助。我现在将包括我的控制器和模型中的内容。 感谢

model sdel

require 'digest/sha1'
class Sdel < ActiveRecord::Base
  attr_accessible :hashed_sdel

  def self.hash(sdel="")
     Digest::SHA1.hexdigest(sdel)
  end

end

controller sdels

class SdelsController < ApplicationController
  def list
    @sdel = Sdel.all
  end

  def new
    @sdel = Sdel.new
  end

  def create
    @sdel = Sdel.new(params[:sdel])
    if @sdel.save
      redirect_to(:action => 'list')
    else
      render('new')
    end
  end
end

迁移文件

class CreateSdels < ActiveRecord::Migration
  def change
    create_table :sdels do |t|
      t.string "hashed_sdel"
      t.timestamps
    end
  end
end

1 个答案:

答案 0 :(得分:3)

听起来您可能希望使用before_save过滤器在hash模型上调用Sdel类方法,然后在保存属性时进行修改。也许就像这样:

require 'digest/sha1'

class Sdel < ActiveRecord::Base
  attr_accessible :hashed_sdel

  before_save { self.hashed_sdel = self.class.hash(hashed_sdel) if hashed_sdel_changed? }

  def self.hash(sdel="")
    Digest::SHA1.hexdigest(sdel)
  end
end

这样,如果您的表单text_field属性为hashed_sdel,则会自动通过您保存记录之前的hash类方法运行(假设属性已从之前的值更改)。