【问题标题】:Rails Validation with ActiveModel使用 ActiveModel 进行 Rails 验证
【发布时间】:2011-06-21 14:00:42
【问题描述】:

我一直在阅读文档以获取 ActiveRecord 验证与 ActiveModel 一起使用。出于某种原因,我没有看到返回任何验证结果。

我有一组模型,它们不是与ActiveRecord 交互,而是通过位于 Rails 后面的自定义 API 进行交互。

模型:

class ApiObject < ApiConnector
  include ActiveModel::Validations
  attr_accessor :fieldName

  validates :fieldName, :presence => true
  def save
    #save method implementation
  end
end

控制器:

def create
  @apiObject = ApiObject.new(params[:api_object])

  respond_to do |format|
    if @apiObject.save
      format.html { redirect_to(@apiObject, :notice => 'User was successfully created.') }
      format.xml  { render :xml => @apiObject, :status => :created, :location => @apiObject }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @apiObject.errors, :status => :unprocessable_entity }
    end
  end
end

形式:

<%= form_for :api_object, :url => '/apiobjectcontroller/' do |f| %>
    <%= f.label :fieldName, 'Field Name' %>
    <%= f.text_field :fieldName %>
    <%= f.submit 'Create'%>
<% end %>

我正在遵循此处列出的代码:Rails ActiveModel Validation

该方法正确返回到表单,因为 @apiObject.save 返回为 false,但没有返回验证响应。我检查了标记,没有返回通常的 rails 验证结果。我错过了什么?

【问题讨论】:

    标签: ruby-on-rails validation ruby-on-rails-3 activemodel


    【解决方案1】:

    这应该完全回答:

    http://asciicasts.com/episodes/211-validations-in-rails-3

    简而言之:使用实例变量创建表单 + 添加必要的代码以显示错误。

    【讨论】:

    • 我已经添加了两者,但当它返回时我仍然一无所获。错误集合为空。
    • errors集合只有在有效时才填写?叫做。也许您必须手动调用有效?
    • 感谢斯科特的工作。更改表单以使用实例变量后,我需要添加对有效的调用?显然 ActiveModel 验证的文档中没有提到它。幸运的是,它现在可以正常工作了。
    • 哈!我正在更新我的原始答案,以在您发表评论的同时包含该答案!好吧,至少其他人会看到完整的解决方案。
    【解决方案2】:

    我有类似的代码可以工作,但我的类中有一个初始化方法。也许你的模型应该是:

    class ApiObject < ApiConnector
      include ActiveModel::Validations
    
      validates :fieldName, :presence => true
    
      attr_accessor :fieldName
    
      def initialize(fieldName)
        @first_name = fieldName
      end
    
      def save
        return false unless valid?
        # save method implementation to go here
        # ...
        true # if save successful, otherwise, false
      end
    end
    

    如果上述方法有效,并且您最终在初始化程序中分配了很多属性,那么您可以使用这个老技巧:

    def initialize(attributes = {})
      attributes.each do |name, value|
        instance_variable_set "@#{name}", value
      end
    end
    

    编辑:添加了对有效的调用?在保存实现中,这样错误集合就会被填写。

    【讨论】:

    • 我认为问题不在于他的代码的验证部分。
    • 谢谢!为球队击掌! :-)
    • 与其做if,否则,你就不能返回valid吗?
    • @stebooks 这只是一种指示性方法,建议真正的save 实现在成功保存时应返回true,如果失败则返回false。这是对大多数 Ruby 爱好者习惯的 ActiveRecord API 精神的一种认可。
    • @stebooks 我想多了。不是很清楚,我同意。我会更新的。
    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2011-12-17
    • 2020-02-12
    • 2015-10-03
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多