我正在为网站创建注册逻辑,并使用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行答案 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 params将model
的特定参数列入白名单。如果您没有将要传递的各种属性列入白名单,那么它就不会允许它们通过。这就是我认为在这里发生的事情
调整上面的代码应该对你有用 - 如果你发表评论我就可以使用
<强>更新强>
这样做:
#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