Ruby on Rails - 无效日期

时间:2014-08-13 16:49:26

标签: ruby-on-rails ruby date ruby-on-rails-4 type-conversion

我创建了一种方法,根据用户的生日计算用户的年龄。

在Rails服务器中运行此消息时收到无效的日期消息。

错误消息

ArgumentError in Users#show
Extracted source (around line #23):
20 </li>
21 
22 <li>
23   <strong>Age:</strong> <%= "#{user_age}" %>
24 </li>
25
26 <li>

方式

def user_age
  Time.now.year - (@user.birthday.split('-').rotate(-1).join('-').to_date.year)
end

在上述方法中,我将用户的生日属性从字符串转换为日期

我在Rails控制台中对此进行了测试,它运行良好,但它在Rails服务器中不起作用。

编辑页面

<% @title = "Edit Profile" %>

<h2>Update your information here</h2>

  <div class = "center">

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

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

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

    <% end %>

</div>

用户控制器(重要操作)

class UsersController < ApplicationController

  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

  private

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

end

User.rb(重要)

class User < ActiveRecord::Base

  VALID_DATE_REGEX = /\A(([1-9]|1[012])[-\/.]([1-9]|[12][0-9]|3[01])[-\/.](19|20)\d\d)|((1[012]|0[1-9])(3[01]|2\d|1\d|0[1-9])(19|20)\d\d)|((1[012]|0[1-9])[-\/](3[01]|2\d|1\d|0[1-9])[-\/](19|20)\d\d)\z/

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

  private

  def date_conversion
    self.birthday = self.birthday.gsub('/', '-')
  end

end

我的 user_age 方法在我在Rails控制台中运行时有效,但在加载应用时收到无效的日期消息。

一个可能的问题是我最新的迁移文件,我将:age 设置为int。

迁移文件

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

我仍然不明白为什么收到无效的日期讯息。在我的方法中,我清楚地将:birthday 字段转换为日期。

这就是为什么它在Rails控制台中有效。我不知道为什么它在Rails服务器中不起作用。

有什么想法吗?非常感谢帮助。

完整堆栈跟踪(第一对线)

activemodel (4.0.4) lib/active_model/attribute_methods.rb:439:in `method_missing'
activerecord (4.0.4) lib/active_record/attribute_methods.rb:167:in `method_missing'
app/views/users/show.html.erb:23:in `_app_views_users_show_html_erb___1002307970_28886880'
actionpack (4.0.4) lib/action_view/template.rb:143:in `block in render'
activesupport (4.0.4) lib/active_support/notifications.rb:161:in `instrument'
actionpack (4.0.4) lib/action_view/template.rb:141:in `render'
actionpack (4.0.4) lib/action_view/renderer/template_renderer.rb:49:in `block (2 levels) in render_template'
actionpack (4.0.4) lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument'

2 个答案:

答案 0 :(得分:8)

事实证明这部分是罪魁祸首

def user_age
  Time.now.year - (@user.birthday.split('-').rotate(-1).join('-').to_date.year)
end

生日被记录为

12/13/1991

我将字符串拆分为(&#39; - &#39;)字符中的数组,该字符在原始字符串中不存在。这就是日期无效的原因。

将生日改为

12-13-1991

解决了这个问题。

答案 1 :(得分:4)

你错过了>

23    <strong>Age:</strong> <%= "#{user_age}" %>