当前位置: 首页 > 知识库问答 >
问题:

Rails未保存模型字段

宿嘉
2023-03-14

我想知道为什么我的铁轨没有拯救我的encrypted_password场。

这是我的UserController

class UserController < ApplicationController
  require 'bcrypt'
  before_filter :save_login_state, :only => [:new, :create]
  def new
    new_user = User.new(user_params)
    new_user.numRatings = 0    
    if new_user.save
      flash[:notice] = "You signed up successfully"
      flash[:color]= "valid"
    else
      flash[:notice] = "Form is invalid"
      flash[:color]= "invalid"
    end
    redirect_to(:controller => 'sessions', :action => 'login')
  end

  def create
  end

  def update
  end

  def view
  end
  private
    def user_params
      params.require(:user).permit(:name, :email, :password, :password_confirmation)
    end
end

这是我的用户模型

class User < ActiveRecord::Base
    require 'BCrypt'
    attr_accessor :password, :encrypted_password
    EMAIL_REGEX = /\A[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\z/i
    validates :email, :presence => true, :uniqueness => true, :format => EMAIL_REGEX
    validates :name, :presence => true
    validates :password, :confirmation => true, :presence => true, :on => :create

    before_save :encrypt_password
    after_save :clear_password

    def encrypt_password
      if password.present?
        self.salt = BCrypt::Engine.generate_salt
        self.encrypted_password = BCrypt::Engine.hash_secret(password, salt)
      end
    end

    def clear_password
      self.password = nil
    end

    def self.authenticate(username_or_email="", login_password="")
      if  EMAIL_REGEX.match(username_or_email)    
        user = User.find_by_email(username_or_email)
      end
      if user && user.match_password(login_password)
        return user
      else
        return false
      end
    end   

    def match_password(login_password="")
      encrypted_password == BCrypt::Engine.hash_secret(login_password, salt)
    end

end

此外,我使用此函数保存它

  def login_attempt
    authorized_user = User.authenticate(params["user"]["email"],params["user"]["password"])
    if authorized_user
        session[:user_id] = authorized_user.id
        flash[:notice] = "Wow Welcome again, you logged in as #{authorized_user.username}"
        redirect_to(:action => 'home')
    else
        flash[:notice] = "Invalid Username or Password"
        flash[:color]= "invalid"
        render "login"  
    end
  end

有一件事我怀疑是我创造了我的第一次迁徙

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :email
      t.string :password
      t.string :name
      t.float :rating
      t.integer :numRatings

      t.timestamps
    end
  end
end

然而,我将:password字段更改为:encrypted_password,它反映在表中。我已经坚持了两个小时了。我想知道是否有什么突出的地方。谢谢

日志显示,注入的数据减去加密密码

插入“用户”(“created_at”、“email”、“name”、“numRatings”、“salt”、“updated_at“)值(?、?、??、?)[[“created_at”,“2014-08-05 06:22:41.335373”],[“电子邮件”,“w@w.com“],[”name“,”w“],“numRatings”,0],[“salt”,“$2a$10$pagmnNzT4FWEBmaPmiLX1u”],[更新日期”,“2014-08-05 06:22:41.335373”]]

共有2个答案

明正德
2023-03-14

您提到您将迁移< code >:密码字段更改为< code>:encrypted_password字段,但是您确定您重新初始化了模型吗?即正确地迁移了变更?最后,如果您更改了迁移,则不需要< code>encrypted_password的< code>attr_accessor。同时拥有这两者可能会导致阴影和问题。

巢安澜
2023-03-14

您的attr_accessor :encrypted_password 突出 - 这是用一个简单地在您的模型实例中设置一个名为 @encrypted_password 的实例变量来覆盖 Rails 生成的属性 getter/setter。

 类似资料:
  • 正如官方文件所说: 有时,您可能不仅希望保存模型,还希望保存其所有关系。为此,您可以使用push方法:保存模型和关系$user- 术语表: term_id 姓名 鼻涕虫 Term_taxonomy表: term_taxonomy_id term_id 描述 我的学期模型: 我的术语分类模型: 我的分类控制器 用我上面的代码,我可以保存名称和段塞,但分类和描述没有插入。有可能吗? 谢谢,我是新来的。

  • 译者 bruce1408 作者: Matthew Inkawhich 本文提供有关Pytorch模型保存和加载的各种用例的解决方案。您可以随意阅读整个文档,或者只是跳转到所需用例的代码部分。 当保存和加载模型时,有三个核心功能需要熟悉: torch.save: 将序列化对象保存到磁盘。 此函数使用 Python 的pickle模块进行序列化。使用此函数可以保存如模型、tensor、字典等各种对象。

  • 问题内容: Laravel中是否有回调,例如: 我搜索了但什么也没找到。如果没有这样的东西-实施它的最佳方法是什么? 谢谢! 问题答案: 实际上,Laravel在保存|更新|创建某些模型之前具有真实的回调。检查一下: https://github.com/laravel/laravel/blob/3.0/laravel/database/eloquent/model.php#L362 像保存和保存

  • 问题内容: 在保存模型之前,我需要重新调整图片大小。但是,如何检查是否添加了新图片或仅更新了说明,以便每次保存模型时都可以跳过重新缩放? 我只想在加载新图像或更新图像时重新缩放,而在更新说明时不想要。 问题答案: 一些想法: 不确定是否可以在所有伪自动django工具中正常运行(例如:ModelForm,contrib.admin等)。

  • 问题内容: 保存模型之前,我需要重新调整图片大小。但是,如何检查是否添加了新图片或仅更新了说明,以便每次保存模型时都可以跳过重新缩放? 我只想在加载新图像或更新图像时重新缩放,而在描述更新时不想要。 问题答案: 一些想法: 不知道它是否可以在所有伪自动django工具中正常运行(例如:ModelForm,contrib.admin等)。

  • 问题内容: 我正在sklearn中使用模型来规范模型的功能。 现在,我想使用相同的缩放器来标准化测试集: 但我不想一直将训练数据与结合使用。有没有一种方法可以保存缩放器并稍后从其他文件中加载它? 问题答案: 所以我实际上不是这方面的专家,但是通过一些研究和一些有用的链接,我认为并将成为您的朋友。 该软件包使您可以将模型或“转储”模型保存到文件中。 我认为此链接也有帮助。它讨论了创建持久性模型。您将