在Rails 4中的自定义验证期间,如何将date_select哈希转换为Date对象?

Agent.Logic_

我是Rails和Ruby的新手。我目前正在一个个人项目中,在允许用户注册之前,我必须检查该用户是否至少13岁为此,我使用了一种自定义验证方法,称为check_age_is_above_13我遇到的问题是date_select视图中的助手将日期分为dob(1i)dob(2i)dob(3i),并且我无法弄清楚如何在User模型中访问这些日期我的代码如下:

移民:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :email, null: false
      t.string :encrypted_password, null: false
      t.string :first_name
      t.string :last_name
      t.string :gender
      t.datetime :dob #date of birth
      t.timestamps
    end
  end
end

User模型如下所示。我下面的代码片段发现在这里,尽管我必须承认这是一个有点..... OUT-日期

class User < ActiveRecord::Base
  #using Devise for Auth
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :trackable,
         :confirmable

  validates :gender, inclusion: { in: %w(female male unknown) }
  validate :check_age_is_above_13

  def check_age_is_above_13
    #The following raises "undefined local variable or method `params'" exception
    dob = Date.new params[:user]['dob(1i)'].to_i, params[:user]['dob(2i)'].to_i, params[:user]['dob(3i)'].to_i
    #Trying the below code raises a "TypeError, expected numeric" exception,
    #which is understandable, as "dob" does not exist in the params list
    if ((Date.today - dob) / 365.25).to_i < 13
      errors.add(:dob, "You must be at least 13 years old to register with us")
    end
  end
end

张贴注册表格时的参数如下所示:

{"utf8"=>"✓",
    "authenticity_token"=>"49w4ylxRIDyuRTDASW+vsuFL6Q3eeWcyokKrNXt9taM=",
    "user"=>{"email"=>"[email protected]",
        "password"=>"[FILTERED]",
        "password_confirmation"=>"[FILTERED]",
        "first_name"=>"Benny",
        "last_name"=>"Lava",
        "gender"=>"male",
        "location_id"=>"1",
        "dob(1i)"=>"2001",
        "dob(2i)"=>"8",
        "dob(3i)"=>"27"},
    "commit"=>"Sign up"}

dob(Xi)在模型上Date执行自定义验证之前,如何访问模型中参数,以便可以先将其转换为对象?我正在使用Devise进行用户身份验证和注册,如果有什么不同的话。

编辑:和视图看起来像这样:

<h2>Sign Up</h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>
  <div>
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true %>
  </div>
  <div>
    <%= f.label :password %><br />
    <%= f.password_field :password, autocomplete: "off" %>
  </div>
  <div>
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "off" %>
  </div>
  <div>
    <%= f.label :first_name %><br/>
    <%= f.text_field :first_name %>
  </div>
  <div>
    <%= f.label :last_name %><br/>
    <%= f.text_field :last_name %>
  </div>
  <div>
    <%= f.label :gender %><br/>
    <%= f.select :gender, options_for_select(%w[female male -]) %>
  </div>
  <div>
    <%= f.label :location_id %><br/>
    <%= f.select :location_id, options_for_select(Location.all.collect { |l| [l.name, l.id]}), {:include_blank => false} %>
  </div>
  <div>
    <%= f.label :dob, "Date of Birth" %><br/>
    <%= f.date_select :dob, {include_blank: false, start_year: Date.today.year - 100, end_year: Date.today.year - 13, default: {day: 31, month: 1, year: 1991}} %>
  </div>
  <div><%= f.submit "Sign up" %></div>
<% end %>

<%= render "devise/shared/links" %>
双重否定

您可以params从控制器访问哈希并查看层,但不能从模型层访问。因此,尝试DateUser模型中创建对象为时已晚。严格来说,您应该已经dob在控制器阶段填写了一个日期,但是如果没有,我建议您在验证之前重写一个create设计控制器方法并在dob那里手动设置变量user只是为了澄清起见,省略了设计的主要部分,您需要这样的内容:

class Users::RegistrationsController < Devise::RegistrationsController
  # POST /resource/sign_up
  def create
    build_resource
    resource.dob = Date.new params[:user]['dob(1i)'].to_i, params[:user]['dob(2i)'].to_i, params[:user]['dob(3i)'].to_i
    if resource.save
      set_flash_message :notice, :signed_up
      sign_in_and_redirect(resource_name, resource)
    else
      clean_up_passwords(resource)
      render_with_scope :new
    end
  end
end

完成之后,您应该已经dobUser模型验证方法中删除了分配行dob

如果您不知道从哪里开始,请查看此要点,其中包含有关覆盖devise控制器的提示。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Rails中,将字符串从date_select转换为Date

来自分类Dev

rails 4 date_select helper定制泰国日历

来自分类Dev

如何设置Rails date_select年选择的CSS类?

来自分类Dev

哪个Rails组件负责解析“ date_select”中的输入?

来自分类Dev

哪个Rails组件负责解析“ date_select”中的输入?

来自分类Dev

rails date_select,仅选择年份

来自分类Dev

Rails 4自定义验证

来自分类Dev

Rails 4如何使需要“ date_select”表单字段帮助程序?

来自分类Dev

如何在Rails中为date_select指定占位符?

来自分类Dev

Rails:方法date_select如何为dom中的每个选择框包括:class?

来自分类Dev

在Rails 4中将Grape自定义验证放在何处

来自分类Dev

Rails自定义验证

来自分类Dev

Rails - 如何将控制器中的自定义方法更改为常规方法?

来自分类Dev

如何在Rails 4中存储自定义常量?

来自分类Dev

railscast#238的问题,date_select无法在rails 4上使用。

来自分类Dev

如何将Rails3路线转换为Rails4

来自分类Dev

Rails 4 HABTM自定义关联验证

来自分类Dev

rails4自定义验证不起作用

来自分类Dev

Rails 无法将哈希转换为整数

来自分类Dev

rails如何在数据库的日期字段中保存date_select字段值

来自分类Dev

Rails自定义验证无法识别

来自分类Dev

Rails的自定义验证无法识别

来自分类Dev

在Rails 3中添加自定义验证

来自分类Dev

基于Rails中的关联值的自定义验证器

来自分类Dev

Rails 中几个属性的自定义验证器

来自分类Dev

Rails 4:从自定义验证器中的错误消息中删除属性名称

来自分类Dev

Rails转换自定义基本错误

来自分类Dev

Rails转换自定义基本错误

来自分类Dev

在Rails 4中正确实现Parsley.js自定义远程验证器

Related 相关文章

热门标签

归档