【问题标题】:Change default population string for form field更改表单字段的默认填充字符串
【发布时间】:2013-10-16 15:40:40
【问题描述】:

我正在 ROR4 上构建一个表单,使用 simple_form gem 来修改我的用户数据。问题是我的数据库被规范化为小写用户的名字和姓氏。所以我的用户模型中有以下内容:

before_save :lowercase_names

def lowercase_names
  self.first_name.downcase!
  self.last_name.downcase!
end

当然,当我用用户对象填充我的更新表单时,我会得到以下信息:

First name: carlos
Last name: ledezma

我想知道是否有办法覆盖此行为,以便 Rails 打印出来:

First name: Carlos
Last name: Ledezma

即字段的标题版本。

提前感谢您的帮助

【问题讨论】:

    标签: ruby-on-rails ruby forms field


    【解决方案1】:

    在您的表单中将值设置为标题名称

    =f.input :first_name, :value => @user.first_name.titleize
    

    以上行会根据您是否使用简单表单而有所不同。但它会给你基本的想法。您正在覆盖输入字段的值

    如果你希望它在任何地方都被改变,那么覆盖 first_name 和 last_name 的 getter

    def last_name
      self.read_attribute(:last_name).titleize
    end
    
    def first_name
      self.read_attribute(:first_name).titleize
    end
    

    请注意,这将在您调用 getter 的任何地方命名您的名字和姓氏

    【讨论】:

    • 这很好用,但是有没有办法让它成为一个通用的解决方案? (不把它放在一个部分)。我的意思是,每次调用该字段时,它的字符串表示都会被命名
    • 您可以覆盖 first_name 和 last_name 的 getter。改变了我的答案
    • 我更正了你的语法,因为 simple_form 没有:value 选项,必须使用input_html 来更改字段的值
    【解决方案2】:

    尝试在表单中使用 text_field 助手的 value 属性将显示的值设置为大写的名字和姓氏:

    <%= f.input :first_name, :value => f.object.first_name.capitalize %>
    <%= f.input :last_name,  :value => f.object.last_name.capitalize %>
    

    【讨论】:

      【解决方案3】:

      更新

      另外,您可以在 User 模型中覆盖 getter 方法,例如:

      def first_name
        self.read_attribute(:first_name).capitalize
      end
      
      def last_name
        self.read_attribute(:last_name).capitalize
      end
      

      【讨论】:

      • 这实际上产生了一个无限递归,因为self.first_name 只会再次调用getter。
      猜你喜欢
      • 2012-04-17
      • 1970-01-01
      • 2013-01-04
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 2016-11-06
      相关资源
      最近更新 更多