1

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

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

然后在浏览器中查看记录,它显示为散列而不是秘密,但如果我尝试通过新操作输入秘密这个词,它不会被散列。我认为创建操作中可能缺少某些内容,但我无法在任何地方找到答案。我将不胜感激任何帮助。我现在将包括我的控制器和模型中的内容。谢谢

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
4

1 回答 1

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您在记录保存之前拥有的类方法运行(假设属性已从其先前的值更改)。

于 2013-09-18T16:46:14.290 回答