如何在验证错误后保留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]'}
答案 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]'}