以rails形式覆盖表单字段值

时间:2013-01-13 15:01:18

标签: ruby-on-rails-3

注意:当我最初问这个问题时,我是在思考问题。接受的答案对于我给出的示例是正确的 - 即您可以将:value传递给text_field,但是我实际上遇到了date_select的问题,:selected => a_date没有覆盖值的工具集。

因此,现在已在Rails中更新,因此您可以设置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 ,它将按预期工作。这将在Rails 4中。


我有一个可以从父模型继承其值的模型。它的工作原理如下:

<%= form_for @user do |f| %>
   <%= f.text_field :field_name, @user['field_name'] %>
<% end %>

然后我有一个表单来编辑用户,但当然,如果用户值为零,那么它会使用公司的值填充表单,这不是我想要的。

我希望能够覆盖表单字段的值,这样如果User值为nil,则该值为空。

尝试1

理想情况下,我能做到:

def field_name_uninherited
  self['field_name']
end

def field_name_uninherited=(value)
  self['field_name']=value
end

但是这不起作用,似乎没有提供覆盖值的机制。

尝试2

所以我考虑创建第二个getter / setter:

<%= f.text_field :field_name_uninherited %>

现在我可以使用field_name并且它按预期工作 - 太棒了! 1 error(s) on assignment of multiparameter attributes 是日期或使用多参数属性的其他类型时,会导致此错误:

{{1}}

我认为这是因为它不知道这是一个日期字段,因为它从数据库中推断出来,而且这个字段(带有_uninherited后缀)不在数据库中。

所以我需要一些方法将我的附加方法标记为与原始数据库字段相同的类型。


进一步说明,上述示例(使用field_name)是简化版本。我实际上使用https://github.com/colinbm/inherits_values_from来处理继承,但我不认为这对这个问题很重要。


显然,如果有更好的方法来实现同一目标,那么我全都听见了。

2 个答案:

答案 0 :(得分:12)

因此,当您为用户显示值时,您希望它的行为有点不同?

我要做的是在表单字段中使用:value选项。这样你就可以像普通一样设置值,但是选择你想要在表单字段中显示的内容。

<%= f.text_field :company, :value => user.field_name_uninherited %>

答案 1 :(得分:1)

根据我的理解,您希望用户输入字段数据,并且仅当它为零时,使用父(公司)模型填充该值。在我看来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,则只会覆盖该值,在创建新元素时将该表单字段留空。希望这有效!