1

簡単に言うと、localhost のデータベースを一掃し、Rails アプリで posgreSQL と pgAdmin を試してみることにしました。最初に、pgAdmin を介して所有していたサーバーをすべて削除しました。次に、、、そして最後に を実行しdb:create:allましdb:migratedb:test:prepare。このデータベースの実験をすべて行う前に、以前の仕様テストを実行するたびに、テストの大部分が失敗し、このエラーが発生します..

 Failure/Error: @user = FactoryGirl.create(:user)
 NoMethodError:
   undefined method `password_reset_sent_at' for #<User:0xb48a55c>

また

 Failure/Error: @user.save
 NoMethodError:
   undefined method `password_reset_sent_at' for #<User:0xaa9c040>

password_reset_sent_atアクセスできない属性として許可していない可能性があると思いましたが、アクセス可能であり、ユーザー モデルにはhas_one :user_reset_password, :dependent => :destroy.

私のdatabase.ymlは次のようになります...

development:
  adapter: postgresql
  encoding: unicode
  database: template_development
  host: localhost
  pool: 5
  username: jason
  password: password

test:
  adapter: postgresql
  encoding: unicode
  database: template_test
  host: localhost
  pool: 5
  username: jason
  password: password

アプリケーションを実行して新しいユーザーを作成すると、このエラーが発生します。

undefined method `password_reset_sent_at' for #<User:0xa6fb184>

app/models/user.rb:78:in `empty_password_reset_token'
app/controllers/users_controller.rb:25:in `create'

そのempty_password_reset_token方法は

def empty_password_reset_token
  if self.password_digest_changed?
    if self.password_reset_sent_at && self.password_reset_sent_at < 2.hours.ago
      false
    else
      self.password_reset_token = ""
      self.password_reset_sent_at = ""
    end
  end
end

私のスキーマファイル

ActiveRecord::Schema.define(:version => 20130124193639) do

  create_table "user_login_failures", :force => true do |t|
    t.integer  "user_id"
    t.integer  "login_failure_attempts"
    t.datetime "created_at",             :null => false
    t.datetime "updated_at",             :null => false
  end

  create_table "user_reset_passwords", :force => true do |t|
    t.integer  "user_id"
    t.string   "password_reset_token"
    t.datetime "password_reset_sent_at"
    t.datetime "created_at",             :null => false
    t.datetime "updated_at",             :null => false
  end

  create_table "users", :force => true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at",      :null => false
    t.datetime "updated_at",      :null => false
    t.string   "password_digest"
  end

  add_index "users", ["email"], :name => "index_users_on_email", :unique => true

end

なぜこれが機能しないのか、私には本当にわかりません。すべてのテーブルには適切な列があり、欠落しているものはありません。どんな助けでも大歓迎です。

4

3 に答える 3

1

db/schema.rb を見てみましょう。テストを実行するたびに、DB は破棄され、そのファイルの内容に基づいて再構築されます。db/schema.rb によると、「users」テーブルに「password_reset_sent_at」列がないと思われます

于 2013-02-02T07:48:52.783 に答える
0

ユーザーモードで使用している列は別のモデルにあるため、最初にそのモデルを呼び出す必要があり、次のように変更password_reset_tokenする必要があります

def empty_password_reset_token
  if self.password_digest_changed?
    build_user_reset_password unless user_reset_password
    if user_reset_password.password_reset_sent_at && user_reset_password.password_reset_sent_at < 2.hours.ago
      false
    else
      user_reset_password.password_reset_token = ""
      user_reset_password.password_reset_sent_at = ""
    end
  end
end

または、デリゲートを使用してメソッドをそのままにしておくことができます

delegate :password_reset_sent_at, :password_reset_token, to: :user_reset_password
于 2013-02-03T00:30:09.480 に答える
0

これはまったく関係ないかもしれません (私は Ruby の経験がありません) が、あなたの質問には多くの「バッククォート」(`) が含まれています。

さまざまな言語で、バック ティック オペレーターはコマンド ラインで実行可能ファイルを実行しようとします。

MySQL は列名の引用にバッククォートを使用するため、MySQL から移行する場合、MySQL SQL ステートメントの残り物である可能性があります

したがって、Ruby は実行を試みる可能性があります。

`password_reset_sent_at' 

システムコマンドとして

[更新] この回答によると、Ruby on Rails はシステム アクセスにもバックティックを使用しているようです: Ruby での system() 呼び出しの出力の取得

そうでない場合は無視してください。助けようとしているだけです:)

于 2013-02-03T16:45:01.553 に答える