注意:当我最初问这个问题时,我想得太多了。对于我给出的示例,接受的答案是正确的 - 即您可以只传递:value
给 text_field,但实际上我遇到了问题date_select
,它没有覆盖值集的工具。
因此,这已在 Rails 中更新,因此您可以设置:selected => a_date
,它会按预期工作。这将在 Rails 4 中。
我有一个可以从父模型继承其值的模型。它的工作原理是这样的:
class User < ActiveRecord::Base
attr_accessible :field_name
belongs_to :company
def field_name
if self['field_name'].nil?
company['field_name']
else
self['field_name']
end
end
end
class Company < ActiveRecord::Base
attr_accessible :field_name
end
然后我有一个表单来编辑用户,但是当然,如果用户值为 nil,那么它会使用来自 Company 的值填充表单,这不是我想要的。
我希望能够覆盖表单字段的值,这样如果 User 值为 nil,则该值为空。
尝试 1
理想情况下,我能够做到:
<%= form_for @user do |f| %>
<%= f.text_field :field_name, @user['field_name'] %>
<% end %>
但这不起作用,似乎没有提供覆盖值的机制。
尝试 2
所以我想创建第二个getter/setter:
def field_name_uninherited
self['field_name']
end
def field_name_uninherited=(value)
self['field_name']=value
end
现在我可以使用<%= f.text_field :field_name_uninherited %>
它了,它按预期工作 - 太棒了!除外:当field_name
是日期,或者其他使用多参数属性的类型时,会导致这个错误:
1 error(s) on assignment of multiparameter attributes
我相信这是因为它不知道这是一个日期字段,因为它是从数据库中推断出来的,并且该字段(带有 _uninherited 后缀)不在数据库中。
所以我需要一些方法来将我的附加方法标记为与原始数据库字段相同的类型。
进一步说明,上述示例(使用 field_name)是简化版本。我实际上是在使用https://github.com/colinbm/inherits_values_from来处理继承,但我认为这对这个问题并不重要。
显然,如果有更好的方法来实现相同的目标,那么我会全力以赴。