【问题标题】:Rails - Render array attribute as string on failed validationRails - 在验证失败时将数组属性呈现为字符串
【发布时间】:2016-01-30 02:17:19
【问题描述】:

我有一个表单字段,用户在其中输入一串标签"foo, bar, foobar"。这将作为item_params[:tag_list] 发送到控制器。在控制器中,我的create 操作包括@item = Item.create(tag_list: item_params[:tag_list])。这会导致 tag_list 属性填充为字符串数组["foo", "bar", "foobar"]

当验证失败时,我需要用"foo, bar, foobar" 填充表单的输入字段,而不是字符串数组。有没有办法在它返回填充验证失败的表单字段之前对其进行操作?

【问题讨论】:

  • 验证是什么?

标签: ruby-on-rails arrays validation


【解决方案1】:

你在使用acts-as-taggable-on gem 吗? 希望这条线能解决你的问题

f.text_field :tag_list, value: f.object.tag_list.join(', ')

或者你必须覆盖Item模型中的tag_list方法

alias_method :array_tag_list, :tag_list
def tag_list
  array_tag_list.join(', ')
end

【讨论】:

  • 我无法让您的建议生效。这可能是因为我正在使用引导标签输入,它导致了问题。如果验证失败,我可以通过将 tag_list 属性更改为字符串来解决我的问题。我在控制器 @item.tag_list.remove(item_params[:tag_list], parse: true) 然后 @item.tag_list.add(item_params[:tag_list]) 中做到了这一点
  • 我认为您必须在 Item 模型中覆盖 tag_list 方法。 alias_method :array_tag_list, :tag_list def tag_list array_tag_list.join(', ') end
【解决方案2】:

对参数被视为数组感到非常惊讶。


抱歉,误读了您的问题(假设您想要验证消息)。将留给后代:

每当您使用validation 时,您都可以访问three interpolationsvalueattributemodel

#app/models/item.rb
class Item < ActiveRecord::Base
   validates :tag_list, x: { message: "%{value} is not valid" }
end

根据docs,可以通过Proc进行直接操作:

#app/models/item.rb
class Item < ActiveRecord::Base
   validates :tag_list, x: { message: ->(key, data) do
       "#{data[:value].join} is not valid"
    end 
   }
end

--

为了填充该字段,您需要使用属性的value 属性,填充data from the form object

= text_field :tag_list, value: f.object.tag_list.join

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2013-07-02
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多