2011-08-27 57 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很棒,因爲它可以讓你使用你正在使用的庫的內部組件,但它有時會傷害到你(不是我沒有犯過這種做法;-))。 –