1

こんにちは、誰かが私を助けてくれることを願っています。現時点では少し立ち往生しています。追跡システム用のアプリを作成しようとしています。現在、sdel_hashed というテーブルがあります。オンラインビデオに従って、これまでにダイジェスト/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を呼び出したいと思うかもしれません。おそらく、これに沿った何か:hashSdel

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_sdelhash

于 2013-09-18T16:46:14.290 に答える