检索ActiveRecord长度验证将返回nil

时间:2011-08-27 16:21:44

标签: ruby-on-rails-3

我想在我的一个视图中检索ActiveRecord字段的maxmimum长度验证。

以下在rails控制台中正常工作并返回正确的值:

irb(main):046:0> micropost = Micropost.new
=> #<Micropost id: nil, content: nil, user_id: nil, created_at: nil, updated_at: nil>
irb(main):047:0> micropost._validators[:content][1].options[:maximum].to_s
=> "140"

但是,当我在控制器中使用相同的代码时,它返回nil:

class PagesController < ApplicationController

  def home
    @title = "Home"
    if signed_in?      
      @micropost = Micropost.new
      @feed_items = current_user.feed.paginate(:page => params[:page])
      @content_max = @micropost._validators[:content][1].options[:maximum].to_s
    end
  end

...

end

我还尝试在我的ApplicationHelper中包含一个方法,该方法也返回nil; - (

def content_max
  Micropost._validators[:content][1].options[:maximum].to_s
end

我做错了什么?

1 个答案:

答案 0 :(得分:0)

无论您是在控制台中还是在Web请求中,_validators数组的顺序可能不同。

Micropost._validators[:content].find {|v| v.class == ActiveModel::Validations::LengthValidator} .options[:maximum].to_s

应该做你想做的事。

恕我直言,更好的解决方案是将长度存储在常量中(我不知道_validators数组是官方API的一部分):

class Micropost < ActiveRecord::Base
    MAX_CONTENT_LENGTH = 140

    validates :content, :length => {:maximum => MAX_CONTENT_LENGTH}

    # Rest of the code...
end

并获得长度:

Micropost::MAX_CONTENT_LENGTH