【问题标题】:Nil Values are being recorded when a form is submitted提交表单时记录 Nil 值
【发布时间】:2014-08-12 20:15:55
【问题描述】:

如果以前有人问过这个问题,我很抱歉,但我在这里找不到答案。

我最近创建了一个 date_regex 验证方法来验证日期

VALID_DATE_REGEX = /\d{2}[\/]\d{2}[\/]\d{4}/

我知道正则表达式现在不好,我稍后会更新,但我不需要任何帮助。

我添加了一个字段,让用户可以选择他们的生日。我必须更新我的用户模型以允许此类功能。

迁移文件

class AddAgeToUsers < ActiveRecord::Migration
  def change
    add_column :users, :age, :integer
    add_column :users, :birthday, :date
    add_column :users, :location, :string
  end
end

这是我在 Users.rb 中的验证

validates :birthday, format: { with: VALID_DATE_REGEX }, :on => :update

为了找出问题所在,我启动了 Rails 控制台

u = User.find(1)
u.update_attributes(:birthday => '12/22/1992')
=> u.save (false)
u.errors.full_messages
=> Birthday is invalid
u.birthday
=> nil

看起来问题是我希望生日的值是“1992 年 12 月 22 日”,但实际上是 nil。

我发现这就是数据库中没有更新记录的原因。不知道是不是属性存储为日期的问题,但它不起作用。

用户控制器

def edit
  @user = User.find(params[:id])
end

def update
  @user = User.find(params[:id])

  if @user.update_attributes(user_params)
    redirect_to @user
    flash[:success] = "Your profile has been updated"
  else
    render 'edit'
  end
end

用户编辑页面

<% @title = "Edit Profile" %>

<h2>Update your information here</h2>

  <div class = "center">

    <%= form_for @user do |f| %>

    <p>
      <%= f.label :name, 'Username', class: 'marker' %>
      <%= f.text_field :name %>
    </p>

    <p> 
      <%= f.label :email, class: 'marker' %>
      <%= f.text_field :email %>
    </p>

    <p> 
      <%= f.label :birthday, class: 'marker' %>
      <%= f.text_field :birthday %>
    </p>

    <p> 
      <%= f.label :location, class: 'marker' %>
      <%= f.text_field :location %>
    </p>

    <p>
      <input class="btn btn-primary" type="submit" value="Update">
    </p>

    <% end %>

</div>

感谢您的帮助。

更新

我将生日属性更改为字符串类型。现在,当我在控制台中运行 update_attributes(:birthday) 时,它会保存,但是当我在文本框中键入相同的内容时,它不会保存。

我想不通。

【问题讨论】:

    标签: ruby-on-rails ruby regex null updating


    【解决方案1】:

    您正在尝试将字符串保存为日期对象。

    u.update_attributes(:birthday => DateTime.strptime("12/22/1992", "%m/%d/%Y")
    

    应该可以工作,因为它将返回一个 Date 对象,然后可以将其保存到您的数据库中

    编辑:如前所述

    u.update_attribute(:birthday, DateTime.strptime("12/22/1992", "%m/%d/%Y")
    

    update_attribute (sans 's') 采用参数(名称、值)。此外,这将跳过验证。

    u.update_attributes(:birthday => DateTime.strptime("12/22/1992", "%m/%d/%Y")
    

    update_attributes 采用散列参数。此外,这不会跳过验证。

    【讨论】:

    • 你已经接近了,唯一的问题是它与我当前的正则表达式不匹配。控制台将生日结果存储为“1992-12-22”,而我的正则表达式要求它显示“12-22-1992”。也许还有另一种方法?
    • update_attribute 语法会导致错误 => Check syntax of update_attribute
    • @DarkMouse 尝试使用“%Y-%m-%d”
    • @DarkMouse,一旦将日期对象转换为 DateTime 对象,就不需要验证它的格式。您最好在将用户输入 转换为日期对象之前验证用户输入。
    【解决方案2】:

    你在这里传递string u.update_attribute(:birthday =&gt; '12/22/1992'),而不是date。这就是:update 失败的原因。检查#strptime 并找到满足您需求的格式。

    试试u.update_attributes(:birthday, Date.strptime("12/22/1992", "%m/%d%Y"))

    更新

    为了让它正确保存(正如你在评论中提到的)尝试

    u.update_attributes(:birthday, Date.strptime("12/22/1992", "%Y-%m-%d"))
    

    【讨论】:

    • u.update_attributes/ u.update_attribute 而不是 u.update_attributed
    • 您在第一行错过了另一个。 :) 仅供参考 u.update_attribute 跳过模型级别的验证,所以 u.update_attributes 会更好。
    • 哦,真的吗?所以使用单数形式我们可以用无效数据更新属性?不知道,谢谢!
    • 没问题。 :) 检查一下:update_attribute 并验证 update_attribute 语法,因为您当前的语法肯定会导致错误。
    【解决方案3】:

    好吧,我终于想通了。有两个问题,第一个是我的生日属性,第二个是我的 users_params。

    如前所述,我将我的生日属性声明为日期字段。如果属性是字符串类型,效果会更好。

    add_column :users, :birthday, :string
    

    然后我迁移文件并使用 Rails 控制台。

    u = User.first
    u.update_attributes(:birthday => "12-22-1992")
    

    这一次值被正确记录并保存。

    u.birthday
    => "12-22-1992"
    

    然后我在我的 Rails 应用程序中的编辑表单中对其进行了测试。

    该值仍然无效,我刚刚发现了原因。

    问题出在我的 user_params 方法上

    def user_params
      params.require(:user).permit(:name, :email, :password, :password_confirmation,
     :location)
    end
    

    我只是将 :birthday 属性添加到我的 users_params 中,它解决了我的问题。这次生日成功保存了。

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2016-09-11
      相关资源
      最近更新 更多