Rails验证 - 确认存在未保存在模型中的表单属性

时间:2014-02-14 05:29:03

标签: ruby-on-rails validation

我的应用程序有一个form_for标记,其元素:foo未保存在form_for中使用的对象的模型中。

我需要使用Rails Validation Helpers确认用户是否为此元素提交了值。但是,'presence'验证器调用object.foo来确认它有一个值。由于foo未保存为我的对象的一部分,我该如何进行此验证呢?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可能应该在控制器操作的params中检查它是否存在:

def create
  @model = MyModel.find(params[:id])
  unless params[:foo].present?
    @model.errors.add(:foo, "You need more foo")
  end

  # ...
end

如果:foo是您的对象的属性未保存在数据库中并且您确实想要使用ActiveRecord Validations,则可以为其创建attr_accessor,并验证此类状态。

class MyModel < ActiveRecord::Base
  attr_accessor :foo
  validates :foo, presence: true
end

但这可能导致保存无效记录,因此您可能不希望这样做。

答案 1 :(得分:1)

试试这个..

class SearchController < ApplicationController
  include ActiveModel::ForbiddenAttributesProtection

  def create
    # Doesn't have to be an ActiveRecord model
    @results = Search.create(search_params)
    respond_with @results
  end

  private

  def search_params
    # This will ensure that you have :start_time and :end_time, but will allow :foo and :bar
    params.require(:val1, :foo).permit(:foo, :bar , whatever else)
  end
end

class Search < ActiveRecord::Base
  validates :presence_of_foo

  private

  def presence_of_foo
    errors.add(:foo, "should be foo") if (foo.empty?) 
  end
end

查看更多here