select_day /年/月预设值

时间:2013-09-04 10:21:40

标签: ruby-on-rails ruby

如何在验证错误后保留select_day的值?我可以像这样设置默认值:

f.select_day 1, {prefix: 'user[birthdate]'}

但是我不能这样做来设置模型中的值:

f.select_day :birthdate, {prefix: 'user[birthdate]'}

错误:

ActionView::Template::Error (undefined method `day' for :birthdate:Symbol)

是否可以或者我需要手动设置params的值?
模型:

class User
  include ActiveModel::Model
  include ActiveRecord::AttributeAssignment
  attr_accessor :birthdate
  def self.build(request, params = {})
    u = self.new
    u.assign_attributes(params)
    u
  end
end

控制器:

def new
  @user = User.new
end

def create
  @user = User.build(params[:user])
end

视图:

= form_for @user do |f|
  f.select_day 1, {prefix: 'user[birthdate]'}
  f.select_month 1, {prefix: 'user[birthdate]'}
  f.select_year 1990, {prefix: 'user[birthdate]'}

4 个答案:

答案 0 :(得分:2)

方法1(Hacky):

您要问的是多参数分配,由assign_multiparameter_attributes完成。

将表单更改为与此类似。

= select_day @user.birthdate, prefix: "user", field_name: "birthdate(3i)"
= select_month @user.birthdate, prefix: "user", field_name: "birthdate(2i)"
= select_year @user.birthdate, prefix: "user", field_name: "birthdate(1i)"

assign_multiparameter_attributes期望知道列类型来设置值。要实现这一点,您必须拥有一个名为column_for_attribute(name)

的方法
attr_accessor :birthdate

def column_for_attribute(name)
  return ActiveRecord::ConnectionAdapters::Column.new(:birthdate, nil, "date") if name.to_sym == :birthdate
end

这就是为什么在没有DB的情况下使用ActiveRecord模块是一个坏主意。

方法2(增强ActiveModel):

看看this。它尝试创建一个BaseModel来处理分配日期。

方法3(自定义代码):

如果您不想使用gem,那么可以在(day, month, year)中引入三个属性User,并使用名为birthdate的方法创建Date这三个人的对象。

如果您在许多地方有类似的要求,我建议增强ActiveModel(方法2)。但是如果你只在一个地方提出这个要求,请参阅方法3。

答案 1 :(得分:2)

如果您查看select_day(以及_month和_year)的文档,您会看到方法通常接受第一个参数的日期。他们也接受你选择做的整数,但这是一个明确的替代实现。

尽管如此,我建议做一些小改动。首先,我强烈考虑在这些行中为User类设置默认的生日。

class User
  attr_accessor :birthdate

  def initialize()
    @birthdate = Date.new 1990, 1, 1
    super
  end

  ...
end

然后,您的表单可以在新视图和编辑视图中使用User#birthdate访问者。

= form_for @user do |f|
  = f.select_day @user.birthdate, prefix: 'user[birthdate]'
  = f.select_month @user.birthdate, prefix: 'user[birthdate]'
  = f.select_year @user.birthdate, prefix: 'user[birthdate]'

答案 2 :(得分:0)

您是否尝试过使用完整选择select_datetime选项?这将自动生成插入日期所需的所有字段。

您还可以使用类似JQueryUI datepicker的内容,它可以让您使用普通文本字段并提供一个很好的小弹出窗口来选择日期,同时还允许用户输入日期他们喜欢。

答案 3 :(得分:-1)

也许你可以尝试:

= f.select_day f.object.birthday, {prefix: 'user[birthdate]'}