ruby-on-rails - 无法使用 Ruby on Rails 获取表单字段以访问数据库
问题描述
我是 Ruby/RoR 的新手,到目前为止一切进展顺利,但我在从表单字段更新数据库时遇到问题(除了生日字段之外,每个字段都保存)。我认为这里有一个小的实现问题,但我无法解决它。
形式:
<%= f.label :birthday %>
<%= f.date_select :birthday, {order: [:month, :day, :year], prompt: { day: 'Select day', month: 'Select month', year: 'Select year' }, start_year: Date.today.year - 118, end_year: Date.today.year}, class: 'form-control' %>
用户型号:
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
解决方案
当您拥有attr_accessor
一个字段时,它会创建可以在 Ruby 上下文中实例化object
但不映射到数据库字段的虚拟属性。
在您的情况下,由于您拥有数据库字段birthday
并且您在update
调用中创建了具有相同名称的虚拟属性,因此该属性仍然分配给虚拟属性,而不是分配给 ActiveRecord 生成的数据库字段。因此,您的对象没有被保存。
attr_accessor
当您在数据库中没有相应的字段,但希望在对象上具有属性时,通常使用 in rails 代码,例如“first_name and
last_name , where database has
full_name”。
此外,在 Rails 的上下文中,attr_accessor
与attr_accessible
. 后者通常用于将参数列入白名单以进行属性的大规模分配;在较新版本的 Rails(您正在使用)中,它被 Strong-parameters 取代
希望能帮助到你 :)
编辑:正在搜索是否有人问过这样的问题。找到这个并认为这对你也有帮助 - https://stackoverflow.com/a/4735726/1376448
推荐阅读
- curl - 如何在用户级别的日期范围内获得所有未接受的答案?
- c++ - 为什么我们不编写可以处理 C++ 标识符的汇编器和链接器呢?
- magento - Magento 2.3 Stamps.com 与回发跟踪的集成问题
- spring - 在 Spring Boot 应用程序中替换属性文件
- html - 悬停效果在移动设备上产生奇怪的行为
- ios - iOS 上的 AmCharts:导出时无法正确显示范围(Ionic App,AmCharts 4)
- javascript - 如何在全局范围内使用 .js 文件作为节点命令?
- python - 不了解移动平均线的实施方式
- javascript - Javascript:基于正则表达式返回昵称的函数
- c# - 从复杂的 JSON 对象创建一个 C# 类,其中动态变量是类名