【问题标题】:Ruby on rails Active Records model not saving to database when neededRuby on rails Active Records 模型在需要时不保存到数据库
【发布时间】:2014-05-27 13:38:04
【问题描述】:

我正在为网站创建注册逻辑,并使用 form_for 从注册页面获取所有数据。我知道数据正在输入,因为我能够对控制器中的输入进行基本的数据过滤。即将到来的数据如下 ruby​​ 所示。

{"utf8"=>"✓",
 "authenticity_token"=>"NOT SHOWN",
 "email"=>"asdf@",
 "password"=>"[FILTERED]",
 "confirmed_password"=>"[FILTERED]",
 "account_type"=>"selection1",
 "submit"=>"Sign Up"}

一旦数据进入,我会在控制器中进行基本数据检查,如下所示。

if params[:email].present? && params[:password].present? && 
  params[:confirmed_password].present?
  #check matching passwords and valid email syntax

  if params[:email].include?('@') && params[:password] == params[:confirmed_password]                      && (params[:account_type] == 'tenant' || params[:account_type] == 'pm')
    #passwords match so account can be created

    @newuser = User.new
    @newuser.user_username = params[:email]
    @newuser.user_hash = params[:email]
    @newuser.user_last_update = Time.now
    @newuser.save          <PROBLEM HAPPENS HERE>

    @newemail = Email.new
    @newemail.email_address = params[:email]
    @newemail.email_parent_id = @newuser.user_id
  else
    #passwords do not match
    flash[:notice] = "PASSWORDS DO NOT MATCH"
  end  
else
  #if any of the fields are empty
  flash[:notice] = "FORM MISSING INPUT"
end

问题在于,一旦它到达保存新用户的行,它就会抛出这个错误。

Mysql2::Error: Column 'user_hash' cannot be null: INSERT INTO `users`   
(`user_dateofbirth`, `user_firstname`, `user_hash`, `user_id`, `user_last_update`, 
`user_lastname`, `user_middlename`, `user_name`) VALUES (NULL, NULL, NULL, NULL, NULL, 
NULL, NULL, NULL)

我已设置其中四列不能为空。 user_hash、user_id、user_username 和 user_last_updated。我感到困惑的是,我在控制器中设置了所有不能为空的值,但是当我保存它们时,它实际上并没有设置这些值。它们都保持为空,它只是告诉我它们不能为空。

那么,我是不是在表格中正确地创建了一个新行或类似的东西。我对 Ruby on Rails 还很陌生,所以我很难过。

差点忘了,这也是用户的模型。我不确定是否需要在此处定义更多内容才能让一切正常工作。

class User < ActiveRecord::Base
# attr_accessible :title, :body
attr_accessor :user_id, :user_username, :user_last_update, :user_hash
end

-

-

更新:

这是设置 user_params 然后将值添加到 newuser 的调用。

    @newuser = User.new(user_params)
    @newuser.user_username = params[:email]
    @newuser.user_hash = params[:email]
    @newuser.user_last_update = Time.now
    @newuser.save

这是 user_params 方法的代码

def user_params
params.require(:newuser).permit(:user_username, :user_hash, :user_last_update)
end

引发的确切错误如下

 TypeError in LoginController#signup

can't convert Symbol into String

Rails.root: /home/rezze-dev/Desktop/Rezze
Application Trace | Framework Trace | Full Trace

app/controllers/login_controller.rb:57:in `user_params'
app/controllers/login_controller.rb:27:in `signup'

This error occurred while loading the following files:
newuser

第 57 行是 user_params 中的 params.require 行

【问题讨论】:

  • 如果你在 User 模型中注释掉 attr_accessor 怎么办?如果您在此模型后面有一个数据库表,则不需要这样做。

标签: ruby-on-rails database activerecord


【解决方案1】:

您的问题在这里:VALUES (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)

您的模型实际上没有数据传递给它


白名单

我会说问题在于您如何构造 ActiveRecord 对象:

@newuser = User.new(user_params) #-> you'll need to whitelist the params

....

private

def user_params
    params.require(:user).permit(:email, :password, :confirmed_password, :account_type, :user_username, :user_hash, :user_last_update)
end

更具体地说,Rails 使用strong paramsmodel 的特定参数列入白名单。如果您没有将希望传递的各种属性列入白名单,它就不会允许它们通过。这就是我认为这里发生的事情

修改我上面的代码应该对你有用 - 如果你发表评论,我有空


更新

这样做:

#app/models/user.rb
Class User < ActiveRecord::Base
   # -> notice nothing here. No need for attr_accessor
end

#app/controllers/users_controller.rb
Class UsersController < ApplicationController
   def some_method
       ... #-> some code
       @user = User.new(user_params)
   end

   private

   def user_params
       parmas.require(:user).permit(:email, :password, :confirmed_password, :account_type, :user_username, :user_hash, :user_last_update)
   end
end 

【讨论】:

  • 刚刚看到您的编辑 - 注释掉您的 attr_accessor - 如果您想声明 virtual 属性(即它们不存在于你的数据库)
  • 我不确定我将如何使用它。由于我只想填写 4 个字段,其他所有内容将在用户创建帐户并注册后填写。这段代码不是强制输入所有内容吗?
  • 不,这意味着您可以传递所需的参数。仅仅因为你允许他们并不意味着你必须分配他们
  • 我在上面的帖子底部快速更新了我尝试过的内容。
  • 我再次更新了帖子,使其格式比 cmets 更好。它都在底部。我不确定为什么它不能正确转换它。我假设我的语法是关闭的,但我不知道在哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多