【问题标题】:How to validate a non-model (and even non-object) field如何验证非模型(甚至非对象)字段
【发布时间】:2012-11-15 08:29:45
【问题描述】:

我有一个表单,其中有很多字段取自数组(而不是模型或对象)。如何验证这些字段是否存在?

<%= simple_form_for :solve, :url => solve_problem_path do |f| %>
  <% @input_variables.each do |label| %>
    <%= f.input label %>
  <% end %>
  ...
<% end %>

【问题讨论】:

  • 通过 Javascript 验证。
  • @MurifoX 不够好,如果用户已停用 javascript 或发送请求怎么办?验证也必须在服务器端完成。

标签: ruby-on-rails ruby forms validation


【解决方案1】:

您可以使用 attr_accessible 执行以下操作:

Class YourClass < ActiveRecord::Base    
  attr_accessible :field_1
  attr_accessible :field_2

  validates :field_1, :presence => true
  validates :field_2, :presence => true
end

编辑:

这可能是一个更好的解决方案:http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/

【讨论】:

  • 我有字段数组,并且没有以前已知的结构,因为我无法创建带有验证的 ActiveModel 对象。
  • 您甚至没有一个活动记录模型以这种形式起作用?在这种情况下,您必须创建一个仅用作验证包装器的工具,或者我想您自己来做。
  • 好的。我可以创建一个仅用于验证的模型。然后我应该将数组中的字段添加到这个模型中并在这些字段上设置验证?
  • 确实,快速而肮脏的方式,但我不知道是否有更优雅的方式使用没有 activerecord 模型的 activerecord 验证器。
  • 我已经更新了我的帖子,提供了一个更好的解决方案的链接,看看
【解决方案2】:

创建一个简单的类来包装请求参数并使用ActiveModel::Validations

# defined somewhere, at the simplest:
require 'ostruct'

class Solve < OpenStruct
  include ActiveModel::Validations
  validates :foo, :bar, :presence => true    

  # you could even check the solution with a validator
  validate do
    errors.add(:base, "WRONG!!!") unless some_correct_condition
  end
end

# then in your controller
def your_method_name
  @solve = Solve.new(params[:solve])

  if @solve.valid?
    # yayyyy!
  else
    # do something with @solve.errors
  end
end

这使您可以像验证模型一样进行验证,并提供 i18n 错误消息等。

编辑:根据您的评论,验证您可能做的一切:

class Solve < OpenStruct
  include ActiveModel::Validations

  # To get the i18n to work fully you'd want to extend ActiveModel::Naming, and
  # probably define `i18n_scope`
  extend ActiveModel::Naming

  validate do
    # OpenStruct maintains a hash @table of its attributes
    @table.each do |key, val|
      errors.add(key, :blank) if val.blank?
    end
  end
end

【讨论】:

  • 好像好多了。但是为所有新属性添加非空验证呢?
  • 对 OpenStruct 解决方案非常肯定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多