Ruby on rails Active Records模型在需要时不保存到数据库

时间:2014-05-27 13:38:05

标签: ruby-on-rails database activerecord

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

{"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

问题是,一旦它到达保存newuser的行,它就会抛出此错误。

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行

1 个答案:

答案 0 :(得分:2)

您的问题出在此处: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