首页 > 解决方案 > 无法使用 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

标签: ruby-on-railsrubyruby-on-rails-5

解决方案


当您拥有attr_accessor一个字段时,它会创建可以在 Ruby 上下文中实例化object但不映射到数据库字段的虚拟属性。

在您的情况下,由于您拥有数据库字段birthday并且您在update调用中创建了具有相同名称的虚拟属性,因此该属性仍然分配给虚拟属性,而不是分配给 ActiveRecord 生成的数据库字段。因此,您的对象没有被保存。

attr_accessor当您在数据库中没有相应的字段,但希望在对象上具有属性时,通常使用 in rails 代码,例如“first_name andlast_name , where database hasfull_name”。

此外,在 Rails 的上下文中,attr_accessorattr_accessible. 后者通常用于将参数列入白名单以进行属性的大规模分配;在较新版本的 Rails(您正在使用)中,它被 Strong-parameters 取代

希望能帮助到你 :)

编辑:正在搜索是否有人问过这样的问题。找到这个并认为这对你也有帮助 - https://stackoverflow.com/a/4735726/1376448


推荐阅读