4

注意:当我最初问这个问题时,我想得太多了。对于我给出的示例,接受的答案是正确的 - 即您可以只传递: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来处理继承,但我认为这对这个问题并不重要。


显然,如果有更好的方法来实现相同的目标,那么我会全力以赴。

4

2 回答 2

15

因此,当涉及到为用户显示您的价值时,您希望它的行为有所不同吗?

我要做的是在:value您的表单字段中使用该选项。这样您就可以像正常一样设置值,但选择您希望在表单字段中显示的内容。

<%= f.text_field :company, :value => user.field_name_uninherited %>
于 2013-01-13T16:35:19.137 回答
1

据我了解,您希望用户放置字段数据,并且仅当它为 nil 时,才使用父(公司)模型填充该值。在我看来,它before_save工作得很好,因为它是在 ActiveRecord 对象上调用 save 方法之前调用的(正如它的名字所建议的那样)。因此,您可以编写这种回调:

    class User < ActiveRecord::Base
      attr_accessible :field_name

      before_save :override_field

      private
        def override_field
          if self.field_name.nil?
            self.field_name = company.field_name
          end
        end

这样,只有在保存时它为 nil 时,您才会覆盖该值,在创建新元素时将该表单字段留空。希望这有效!

于 2013-01-13T15:38:29.237 回答