2011-08-27 58 views
1

我想在我的某个视图中检索ActiveRecord字段的最大长度验证。正在检索ActiveRecord长度验证返回零

在轨控制台以下罚款作品,并返回正确的值:

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,这也返回零;-(

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

w ^我做错了什么?

+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 
+0

嗨Benoit, 我试过你的第一个解决方案,它工作正常,除了在输入字段中提交的字符太多时,@variable我分配了_validators值,原来由于某种原因是零。也许这个变量超出了shared/_error_messages部分的范围? 无论如何,由于这一点以及您对_validators数组作为官方API一部分的担心,我决定实施您的第二个解决方案(我也发现它更干净),并添加了一个帮助器方法来获取视图中的长度。 感谢您的帮助。 – Peter

+0

不客气。 Ruby很棒,因为它可以让你使用你正在使用的库的内部组件,但它有时会伤害到你(不是我没有犯过这种做法;-))。 –