Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用RubyonRails将表单字段添加到数据库时遇到问题_Ruby On Rails_Ruby_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails 使用RubyonRails将表单字段添加到数据库时遇到问题

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

我是Ruby/RoR新手,到目前为止一切都很顺利,但是我在从表单字段更新数据库时遇到了问题(每个字段都保存,生日字段除外)。我假设这里有一个小的实现问题,但我在解决它时遇到了麻烦

表格:

现场数据库迁移

    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