0

验证错误后如何保留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)

是否有可能或者我需要手动从参数获取和设置值?
模型:

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

4 回答 4

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

这就是为什么使用ActiveRecord没有 DB 的模块是一个坏主意的原因。

方法 2(增强 ActiveModel):

看看这个。它尝试创建一个BaseModel处理分配日期的方法。

方法 3(自定义代码):

如果您不想使用 gem,那么方法是在其中引入三个属性并调用一个方法,该方法从这三个属性(day, month, year) 中创建对象。UserbirthdateDate

如果您在许多地方有类似的要求,我建议您增强 ActiveModel(方法 2)。但是,如果您只在一个地方有此要求,请使用方法 3。

于 2013-11-12T08:13:04.687 回答
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]'
于 2013-11-14T20:52:34.417 回答
0

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

您还可以考虑使用JQueryUI datepicker 之类的东西,它允许您使用普通文本字段并提供一个不错的小弹出窗口来选择日期,同时还允许用户根据需要输入日期。

于 2013-11-15T16:22:00.827 回答
-1

也许你可以尝试这样做:

= f.select_day f.object.birthday, {prefix: 'user[birthdate]'}
于 2013-11-11T09:37:55.733 回答