什么可能导致无法从数据库中读取对象的属性?

时间:2013-09-25 07:25:15

标签: ruby-on-rails-4

是的,这是我遇到的最奇怪的错误。

我的资源中有一个名为hashed_pa​​ssword的字段,数据类型为字符串。什么都看不懂。这太疯狂了。

用户表

id | username | created_at | updated_at | hashed_password

示例数据

37 | john harris | 2013-09-24 |  2013-09-24 | eba082ff45517c06b

用户指数

<% @users.each do |user| %>
  <tr>
    <td><%= user.id %></td>
    <td><%= user.username %></td>
    <td><%= user.password.inspect %></td>
    <td><%= user.hashed_password.inspect %></td>
    <td><%= user.created_at %></td>
    <td><%= user.updated_at %></td>
    <td><%= link_to 'Show', user %></td>
    <td><%= link_to 'Edit', edit_user_path(user) %></td>
    <td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>

HTML

1

约翰哈里斯

2013年9月24日

2013年9月24日

它就坐在数据库中,但它无法读取。这太奇怪了。它只存在为零。

唯一不同的是它和其他列是以编程方式设置的。这是用户控制器:

require "digest/sha1"
class User < ActiveRecord::Base
    attr_accessor :password

    before_create :hashed_password

    def self.authenticate(username, password)
        logger.info "*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-"
        logger.info "user " + username

        user = find_by_username(username)

        logger.info "user id: " + user.id.to_s
        logger.info "user username: " + user.username.to_s
        logger.info "user hashed_password: " + user.hashed_password.to_s
        logger.info "user created_at: " + user.created_at.to_s
        logger.info "user updated_at: " + user.updated_at.to_s
        logger.info "*-*-*-*-*-*-*-*-"
        logger.info "entered hashed password " + Digest::SHA1.hexdigest(password)

        if user && user.hashed_password == Digest::SHA1.hexdigest(password)
            logger.info "SUCCESS"
            user
        else
            nil
        end
    end

    def hashed_password
        if password.present?
            self.hashed_password = Digest::SHA1.hexdigest(password)
        end
    end

但是一旦它在数据库中不应该有所作为,它应该吗?它只是拒绝被阅读。此外,日志文件:

Started POST "/sessions" for 127.0.0.1 at 2013-09-25 08:06:45 +0100
Processing by SessionsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"p5tDog8wOD6+H3fSFZpDXkMxNzFxej3tay6slVmIF5Y=", "username"=>"john harris", "password"=>"[FILTERED]", "commit"=>"Log in"}
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
user john harris
  [1m[35mUser Load (0.0ms)[0m  SELECT "users".* FROM "users" WHERE "users"."username" = 'john harris' LIMIT 1
user id: 37
user username: john harris
user hashed_password: 
user created_at: 2013-09-25 07:06:28 UTC
user updated_at: 2013-09-25 07:06:28 UTC
*-*-*-*-*-*-*-*-
entered hashed password eba082ff45517c06bd365c2fde1fc77cda7a8f6f
  Rendered sessions/new.html.erb within layouts/application (1.0ms)
Completed 200 OK in 11ms (Views: 8.0ms | ActiveRecord: 0.0ms)

请注意用户hashed_pa​​ssword:条目的空白。到底是怎么回事?一旦数据在数据库中,无论它如何到达,都应该能够读取数据。太奇怪了。

我唯一能想到的是 hashed_pa​​ssword 是一个关键字,而rails对它做了一些愚蠢的事情。这就是我所能想到的。完全不知所措。

1 个答案:

答案 0 :(得分:0)

用于设置hashed_pa​​ssword的回调方法与属性具有相同的名称,将其重命名为唯一的,因为它会覆盖属性访问者。