Ruby on rails 使用RubyonRails将表单字段添加到数据库时遇到问题
我是Ruby/RoR新手,到目前为止一切都很顺利,但是我在从表单字段更新数据库时遇到了问题(每个字段都保存,生日字段除外)。我假设这里有一个小的实现问题,但我在解决它时遇到了麻烦 表格: 现场数据库迁移Ruby on rails 使用RubyonRails将表单字段添加到数据库时遇到问题,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,我是Ruby/RoR新手,到目前为止一切都很顺利,但是我在从表单字段更新数据库时遇到了问题(每个字段都保存,生日字段除外)。我假设这里有一个小的实现问题,但我在解决它时遇到了麻烦 表格: 现场数据库迁移 add_column :users, :birthday, :date add_column :users, :month, :date add_column :users, :day, :date add_column :users, :year, :date
add_column :users, :birthday, :date
add_column :users, :month, :date
add_column :users, :day, :date
add_column :users, :year, :date
当您拥有字段的
attr\u访问器时,它会创建虚拟属性,这些属性可以在Ruby对象的上下文中实例化,但不会映射到数据库的字段
在您的情况下,由于您有数据库字段生日
,并且您使用相同的名称创建了虚拟属性,因此在更新
调用中,该属性仍然分配给虚拟属性,而不是分配给ActiveRecord生成的数据库字段。因此,您的对象未被保存
rails代码中的attr\u accessor
通常用于数据库中没有相应字段,但希望在对象上具有属性的情况,例如“first\u name和
last\u name,其中数据库具有
全名”
另外,在Rails的上下文中,attr\u访问器
不同于attr\u访问器
。后者通常用于白名单参数,用于属性的大规模分配;在较新版本的Rails(您正在使用)中,它被强参数替换
希望有帮助:)
编辑:正在搜索是否有人提出此类问题。找到这个并认为这对您也有帮助-您是否有一些预处理(保存前或创建前等)在模型中就位?您是否测试了用户参数
中的else
块是否正在启动?如果在更新方法的顶部打印参数,您会看到什么?我有:生日包含在属性访问器中:记住令牌,:激活令牌,:reset_token
一旦我删除了它,它似乎会保存下来-有人能提供上下文来解释这是一个问题的原因吗?这是否仅仅是因为模型从数据库中提取了nil,并在更新用户参数之前将其设置为:birth(又名:表单中的birth被nil值覆盖)?@MA1添加了一个详细解释的答案。很好的链接——感谢您的解释和额外资源!谢谢,我没有!
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
flash[:success] = "Profile updated"
redirect_to @user
else
render 'edit'
end
end
def user_params
unless logged_in?
params.require(:user).permit(:first_name, :last_name, :email, :usertype, :password,:password_confirmation)
else
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation, :street, :city, :state, :zipcode, :phone_number, :birthday, :month, :day, :year)
end
end
add_column :users, :birthday, :date
add_column :users, :month, :date
add_column :users, :day, :date
add_column :users, :year, :date