Ruby on rails RubyonRails活动记录模型在需要时不保存到数据库
我正在为一个网站创建注册逻辑,并使用表单从注册页面获取所有数据。我知道数据正在输入,因为我能够对控制器中的输入进行基本数据过滤。下面是ruby显示的数据Ruby on rails RubyonRails活动记录模型在需要时不保存到数据库,ruby-on-rails,database,activerecord,Ruby On Rails,Database,Activerecord,我正在为一个网站创建注册逻辑,并使用表单从注册页面获取所有数据。我知道数据正在输入,因为我能够对控制器中的输入进行基本数据过滤。下面是ruby显示的数据 {"utf8"=>"✓", "authenticity_token"=>"NOT SHOWN", "email"=>"asdf@", "password"=>"[FILTERED]", "confirmed_password"=>"[FILTERED]", "account_type"=>"sele
{"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
我已设置其中四列不能为null。用户哈希、用户id、用户用户名和上次更新的用户。让我感到困惑的是,我在控制器中设置了所有不能为null的值,但当我保存它们时,实际上并没有设置这些值。它们都是空的,它只是告诉我它们不能是空的
那么,我是否没有正确地在表中创建新行或类似的内容。我对RubyonRails还相当陌生,所以我被难住了
差点忘了,这是供用户使用的模型。我不确定我是否需要在这里定义更多,以使一切正常工作
class User < ActiveRecord::Base
# attr_accessible :title, :body
attr_accessor :user_id, :user_username, :user_last_update, :user_hash
end
以下是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行您的问题在这里:
值(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用于将模型的特定参数列入白名单。如果您不将希望传递的各种属性列为白名单,它将不允许它们通过。我相信这就是这里发生的事情
修改我上面的代码应该对你有用-如果你留下评论,我随时可以为你服务
更新
这样做:
#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
#app/models/user.rb
类用户这里什么都没注意到。不需要属性访问器
结束
#app/controllers/users\u controller.rb
类UsersController 一些代码
@user=user.new(用户参数)
结束
私有的
def用户参数
parmas.require(:user).permit(:email,:password,:confirmed\u password,:account\u type,:user\u username,:user\u hash,:user\u last\u update)
结束
结束
如果您注释掉用户模型中的attr\u访问器
,该怎么办?如果您在这个模型后面有一个数据库表,那么就不需要这样做。刚才看到您的编辑-注释掉您的attr_访问器-您只需要在您想要声明虚拟属性(即它们不在您的数据库中)时才需要这样做。我不确定我将如何确切地使用它。因为我只想填写4个字段,其他所有内容将在用户创建帐户并注册后填写。这不是强制输入所有内容的代码吗?不,这意味着您可以传递所需的参数。仅仅因为你允许他们,并不意味着你必须分配他们。我在上面的帖子底部快速更新了我尝试过的内容。我再次更新了帖子,使其格式比评论更好。一切都在底部。我不知道为什么它不能正确地转换它。我假设我的语法是关闭的,但我不知道在哪里。
@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
#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