提交表单时会记录无值

时间:2014-08-12 20:15:55

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

如果之前有人问过我,我很抱歉,但我找不到答案。

我最近创建了一个用于验证日期的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

看起来问题是我预计生日的价值是'12 / 22/1992'但是它是零。

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

用户控制器

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>

非常感谢帮助。

更新

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

我无法弄清楚这一点。

3 个答案:

答案 0 :(得分:2)

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

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接受hash参数。此外,这不会跳过验证。

答案 1 :(得分:1)

您在string传递了u.update_attribute(:birthday => '12/22/1992'),而不是date。这是:update失败的原因。检查#strptime并找到符合您需求的格式。

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

UPD

要使其正确保存(正如您在评论中所述),请尝试

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

答案 2 :(得分:0)

好吧,伙计们,我终于明白了。有2个问题,第一个是我的生日属性,第二个是我的users_params。

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

add_column :users, :birthday, :string

然后我迁移了该文件并使用Rails Console。

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中,它解决了我的问题。这次生日成功保存。

感谢大家的帮助。