2011-08-08 5 views
11

새로운 Rails 3.1 rc5 응용 프로그램을 프로덕션 모드에서 실행하면 stange random crash가 발생합니다. 백엔드는 3 개의 얇은 인스턴스가있는 nginx입니다.생산중인 Rails 3.1에서 Stange random crashes가 발생했습니다.

[Exception] users#show (NoMethodError) "undefined method `text?' for nil:NilClass" 

undefined method `text?' for nil:NilClass 
 activerecord (3.1.0.rc5) lib/active_record/validations/uniqueness.rb:57:in `build_relation' 

로그를 켜기 : 디버그. 그러나 유일한 정보는 "내부 서버 오류"입니다. 이전에 본 사람이 있습니까? 신원지도가 옴으로 설정되어 있습니다 ...

씬을 다시 시작하면 레일스가 몇 시간 동안 문제없이 실행됩니다.

업데이트 1 : 마치이 오류를 무작위로 생성하는 모든 컨트롤러 동작처럼 보입니다. 오늘 아침 나는 위의 오류로 이메일을 받았습니다. 링크를 따라 가면 문제없이 페이지가 생성됩니다.

이 문제가 어떻게 쿠키에서 사용자를로드하는 것과 관련이 있는지 궁금합니다. 사용자 #에서

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    layout "content_with_sidebar" 
    before_filter :system 

    rescue_from CanCan::AccessDenied do |exception| 
    flash[:warning] = "Ingen adgang!" 
    redirect_to root_url 
    end 

    def system 
    if current_user 
     unless current_user.email_verified == "t" 
     flash[:warning] = 'Please activate your account.' 
     end 
     current_user.last_seen = Time.now 
     current_user.save # <--- line 18 
     @new_messages = Message.new_messages(current_user).count 
    end 
    end 

    helper_method :current_user 

    private 

    def current_user 
    if cookies[:auth_token] 
     @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) 
    end 
    end 
end 

코드 예제는이 디버그가 추가로 내가 가진 정보입니다 갱신 2

class UsersController < ApplicationController 
    before_filter :ensure_current_user_url, :only => :show 
    load_and_authorize_resource 

    def ensure_current_user_url 
    @user = User.find(params[:id].downcase) 
    redirect_to @user, :status => :moved_permanently unless @user.friendly_id_status.best? 
    end 

    def show 
    if params[:do] == "guestbook" 
     @comment = @user.comments.new 
     @comments = @user.comments.includes(:author).order("created_at DESC").all(:limit => 5) 
    else 
     @recent_comments = @user.comments(:order => "created_at DESC") 
    end 
    @arts = @user.arts.order("created_at desc").includes([:author, :category]).page(params[:page]).per(24) 
    render :layout => "content_with_sidebar_whitebox" 
    end 

을 표시합니다.

************** username 
************** ["id", "username", "email", "email_verified", "birthday", "firstname", "lastname", "phone", "website", "profile", "last_seen", "administrator", "cached_slug", "password_salt", "crypted_password", "avatar", "avatar_cache", "comments_count", "arts_count", "auth_token", "account_activation_token", "account_activation_sent_at", "password_reset_token", "password_reset_sent_at", "created_at", "updated_at", "cheapest", "most_expensive"] 
************** email 
************** ["id", "username", "email", "email_verified", "birthday", "firstname", "lastname", "phone", "website", "profile", "last_seen", "administrator", "cached_slug", "password_salt", "crypted_password", "avatar", "avatar_cache", "comments_count", "arts_count", "auth_token", "account_activation_token", "account_activation_sent_at", "password_reset_token", "password_reset_sent_at", "created_at", "updated_at", "cheapest", "most_expensive"] 

이것은 오늘 아침의 충돌로 인한 전체 스택 추적입니다.

Started GET "/messages" for filtered-ip at 2011-08-15 12:13:17 -0400 


Processing by MessagesController#index as HTML 
    User Load (1.5ms) SELECT "users".* FROM "users" WHERE "users"."auth_token" = '380e8b776cb8e3c5fd7d8b777b6d2073' ORDER BY last_seen desc LIMIT 1 
    (0.3ms) BEGIN 
    (0.9ms) SELECT 1 FROM "users" WHERE ("users"."username" = 'samia-dk' AND "users"."id" != 483) LIMIT 1 
    (0.9ms) SELECT 1 FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 483) LIMIT 1 
    (0.4ms) ROLLBACK 
Completed 500 Internal Server Error in 14ms 
Rendered /usr/local/rvm/gems/[email protected]/gems/exception_notification_rails3-1.2.0/lib/exception_notifier/views/exception_notifier/_request.text.erb (0.8ms) 
Rendered /usr/local/rvm/gems/[email protected]/gems/exception_notification_rails3-1.2.0/lib/exception_notifier/views/exception_notifier/_title.text.erb (0.4ms) 
Rendered /usr/local/rvm/gems/[email protected]/gems/exception_notification_rails3-1.2.0/lib/exception_notifier/views/exception_notifier/_session.text.erb (0.9ms) 
Rendered /usr/local/rvm/gems/[email protected]/gems/exception_notification_rails3-1.2.0/lib/exception_notifier/views/exception_notifier/_title.text.erb (0.1ms) 
Rendered /usr/local/rvm/gems/[email protected]/gems/exception_notification_rails3-1.2.0/lib/exception_notifier/views/exception_notifier/_environment.text.erb (55.3ms) 
Rendered /usr/local/rvm/gems/[email protected]/gems/exception_notification_rails3-1.2.0/lib/exception_notifier/views/exception_notifier/_title.text.erb (0.3ms) 
Rendered /usr/local/rvm/gems/[email protected]/gems/exception_notification_rails3-1.2.0/lib/exception_notifier/views/exception_notifier/_backtrace.text.erb (1.7ms) 
Rendered /usr/local/rvm/gems/[email protected]/gems/exception_notification_rails3-1.2.0/lib/exception_notifier/views/exception_notifier/_title.text.erb (0.2ms) 
Rendered /usr/local/rvm/gems/[email protected]/gems/exception_notification_rails3-1.2.0/lib/exception_notifier/views/exception_notifier/exception_notification.text.erb (71.8ms) 

Sent mail to [email protected] (3072ms) 
Date: Mon, 15 Aug 2011 12:13:18 -0400 
From: Exception Notifier <[email protected]> 
To: [email protected] 
Message-ID: <[email protected]> 
Subject: [Exception] messages#index (NoMethodError) "undefined method `text?' 
for nil:NilClass" 
Mime-Version: 1.0 
Content-Type: text/plain; 
charset=UTF-8 
Content-Transfer-Encoding: 7bit 

A NoMethodError occurred in messages#index: 

    undefined method `text?' for nil:NilClass 
    config/initializers/some_debug.rb:6:in `build_relation' 

------------------------------- 
Request: 
------------------------------- 

    * URL  : http://www.myblog.dk/messages 
    * IP address: filtered 
    * Parameters: {"action"=>"index", "controller"=>"messages"} 
    * Rails root: /home/atmorell/Dropbox/myblog5 

------------------------------- 
Session: 
------------------------------- 

    * session id: nil 
    * data: {"_csrf_token"=>"filtered=", 
    "user_credentials"=>true, 
    "user_credentials_id"=>483} 

------------------------------- 
Environment: 
------------------------------- 

    * GATEWAY_INTERFACE       : CGI/1.2 
    * HTTP_ACCEPT        : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
    * HTTP_ACCEPT_CHARSET      : ISO-8859-1,utf-8;q=0.7,*;q=0.7 
    * HTTP_ACCEPT_ENCODING      : gzip, deflate 
    * HTTP_ACCEPT_LANGUAGE      : en,da;q=0.7,en-us;q=0.3 
    * HTTP_CONNECTION       : close 
    * HTTP_COOKIE        : __utma=52641074.268317442.1313423882.1313423882.1313423882.1; __utmb=52641074.53.10.1313423882; __utmc=52641074; __utmz=52641074.1313423882.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _myblog_session5=ed471364634fcd3b44c7bb0eae758b14; user_credentials=true%3A%3A483; auth_token=filtered 
    * HTTP_HOST         : www.myblog.dk 
    * HTTP_REFERER        : http://www.myblog.dk/messages/new 
    * HTTP_USER_AGENT       : Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0 
    * HTTP_VERSION        : HTTP/1.0 
    * PATH_INFO         : /messages 
    * QUERY_STRING        : 
    * REMOTE_ADDR        : filtered-ip 
    * REQUEST_METHOD       : GET 
    * REQUEST_PATH        : /messages 
    * REQUEST_URI        : /messages 
    * SCRIPT_NAME        : 
    * SERVER_NAME        : www.myblog.dk 
    * SERVER_PORT        : 80 
    * SERVER_PROTOCOL       : HTTP/1.1 
    * SERVER_SOFTWARE       : thin 1.2.11 codename Bat-Shit Crazy 
    * action_controller.instance    : messages#index 
    * action_dispatch.cookies     : #<ActionDispatch::Cookies::CookieJar:0x00000008766b98> 
    * action_dispatch.parameter_filter   : [:password, /RAW_POST_DATA/] 
    * action_dispatch.remote_ip     : filtered-ip 
    * action_dispatch.request.content_type  : 
    * action_dispatch.request.formats   : [text/html] 
    * action_dispatch.request.parameters  : {"action"=>"index", "controller"=>"messages"} 
    * action_dispatch.request.path_parameters : {:action=>"index", :controller=>"messages"} 
    * action_dispatch.request.query_parameters : {} 
    * action_dispatch.request.request_parameters: {} 
    * action_dispatch.routes     : #<ActionDispatch::Routing::RouteSet:0x00000002eaf658> 
    * action_dispatch.secret_token    : 93479c2e63bdb766a51f18397345cdc9a8b22ee009334171207f6b0bc2e71105d1f849de46e34965febc3b178cea662e89986e73d8922ec4915c44dca6ae4000 
    * action_dispatch.show_exceptions   : true 
    * async.callback       : #<Method: Thin::Connection#post_process> 
    * async.close        : #<EventMachine::DefaultDeferrable:0x000000087809a8> 
    * exception_notifier.options    : {:email_prefix=>"[Exception] ", :sender_address=>"\"Exception Notifier\" <[email protected]>", :exception_recipients=>["[email protected]"], :ignore_exceptions=>[ActiveRecord::RecordNotFound, AbstractController::ActionNotFound, ActionController::RoutingError]} 
    * rack-cache.allow_reload     : false 
    * rack-cache.allow_revalidate    : false 
    * rack-cache.cache_key      : Rack::Cache::Key 
    * rack-cache.default_ttl     : 0 
    * rack-cache.entitystore     : rails:/ 
    * rack-cache.metastore      : rails:/ 
    * rack-cache.private_headers    : ["Authorization", "Cookie"] 
    * rack-cache.storage      : #<Rack::Cache::Storage:0x000000029e9b50> 
    * rack-cache.verbose      : true 
    * rack.errors        : #<IO:0x00000000c27860> 
    * rack.input        : #<StringIO:0x00000008784c10> 
    * rack.multiprocess       : false 
    * rack.multithread       : false 
    * rack.request.cookie_hash     : {"__utma"=>"52641074.268317442.1313423882.1313423882.1313423882.1", "__utmb"=>"52641074.53.10.1313423882", "__utmc"=>"52641074", "__utmz"=>"52641074.1313423882.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)", "_myblog_session5"=>"ed471364634fcd3b44c7bb0eae758b14", "user_credentials"=>"true::483", "auth_token"=>"filtered"} 
    * rack.request.cookie_string    : __utma=52641074.268317442.1313423882.1313423882.1313423882.1; __utmb=52641074.53.10.1313423882; __utmc=52641074; __utmz=52641074.1313423882.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _myblog_session5=ed471364634fcd3b44c7bb0eae758b14; user_credentials=true%3A%3A483; auth_token=filtered 
    * rack.request.query_hash     : {} 
    * rack.request.query_string     : 
    * rack.run_once        : false 
    * rack.session        : {"_csrf_token"=>"jlK/filtered=", "user_credentials"=>true, "user_credentials_id"=>483} 
    * rack.session.options      : {:key=>"_myblog_session5", :path=>"/", :domain=>nil, :expire_after=>nil, :secure=>false, :httponly=>true, :defer=>false, :renew=>false, :id=>"ed471364634fcd3b44c7bb0eae758b14"} 
    * rack.session.record      : #<ActiveRecord::SessionStore::Session:0x000000087762f0> 
    * rack.url_scheme       : http 
    * rack.version        : [1, 0] 

    * Process: 1938 
    * Server : li267-196 

------------------------------- 
Backtrace: 
------------------------------- 

    config/initializers/some_debug.rb:6:in `build_relation' 
    activerecord (3.1.0.rc5) lib/active_record/validations/uniqueness.rb:25:in `validate_each' 
    activemodel (3.1.0.rc5) lib/active_model/validator.rb:153:in `block in validate' 
    activemodel (3.1.0.rc5) lib/active_model/validator.rb:150:in `each' 
    activemodel (3.1.0.rc5) lib/active_model/validator.rb:150:in `validate' 
    activesupport (3.1.0.rc5) lib/active_support/callbacks.rb:302:in `_callback_before_483' 
    activesupport (3.1.0.rc5) lib/active_support/callbacks.rb:622:in `_run_validate_callbacks' 
    activesupport (3.1.0.rc5) lib/active_support/callbacks.rb:81:in `run_callbacks' 
    activemodel (3.1.0.rc5) lib/active_model/validations.rb:212:in `run_validations!' 
    activemodel (3.1.0.rc5) lib/active_model/validations/callbacks.rb:53:in `block in run_validations!' 
    activesupport (3.1.0.rc5) lib/active_support/callbacks.rb:401:in `_run_validation_callbacks' 
    activesupport (3.1.0.rc5) lib/active_support/callbacks.rb:81:in `run_callbacks' 
    activemodel (3.1.0.rc5) lib/active_model/validations/callbacks.rb:53:in `run_validations!' 
    activemodel (3.1.0.rc5) lib/active_model/validations.rb:179:in `valid?' 
    activerecord (3.1.0.rc5) lib/active_record/validations.rb:69:in `valid?' 
    activerecord (3.1.0.rc5) lib/active_record/validations.rb:77:in `perform_validations' 
    activerecord (3.1.0.rc5) lib/active_record/validations.rb:50:in `save' 
    activerecord (3.1.0.rc5) lib/active_record/attribute_methods/dirty.rb:22:in `save' 
    activerecord (3.1.0.rc5) lib/active_record/transactions.rb:241:in `block (2 levels) in save' 
    activerecord (3.1.0.rc5) lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status' 
    activerecord (3.1.0.rc5) lib/active_record/connection_adapters/abstract/database_statements.rb:183:in `transaction' 
    activerecord (3.1.0.rc5) lib/active_record/transactions.rb:208:in `transaction' 
    activerecord (3.1.0.rc5) lib/active_record/transactions.rb:293:in `with_transaction_returning_status' 
    activerecord (3.1.0.rc5) lib/active_record/transactions.rb:241:in `block in save' 
    activerecord (3.1.0.rc5) lib/active_record/transactions.rb:252:in `rollback_active_record_state!' 
    activerecord (3.1.0.rc5) lib/active_record/transactions.rb:240:in `save' 
    app/controllers/application_controller.rb:18:in `system' 
    activesupport (3.1.0.rc5) lib/active_support/callbacks.rb:430:in `_run__163591495713425608__process_action__3187008165500041637__callbacks' 
    activesupport (3.1.0.rc5) lib/active_support/callbacks.rb:386:in `_run_process_action_callbacks' 
    activesupport (3.1.0.rc5) lib/active_support/callbacks.rb:81:in `run_callbacks' 
    actionpack (3.1.0.rc5) lib/abstract_controller/callbacks.rb:17:in `process_action' 
    actionpack (3.1.0.rc5) lib/action_controller/metal/rescue.rb:17:in `process_action' 
    actionpack (3.1.0.rc5) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action' 
    activesupport (3.1.0.rc5) lib/active_support/notifications.rb:55:in `block in instrument' 
    activesupport (3.1.0.rc5) lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
    activesupport (3.1.0.rc5) lib/active_support/notifications.rb:55:in `instrument' 
    actionpack (3.1.0.rc5) lib/action_controller/metal/instrumentation.rb:29:in `process_action' 
    actionpack (3.1.0.rc5) lib/action_controller/metal/params_wrapper.rb:202:in `process_action' 
    activerecord (3.1.0.rc5) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
    actionpack (3.1.0.rc5) lib/abstract_controller/base.rb:121:in `process' 
    actionpack (3.1.0.rc5) lib/abstract_controller/rendering.rb:45:in `process' 
    actionpack (3.1.0.rc5) lib/action_controller/metal.rb:193:in `dispatch' 
    actionpack (3.1.0.rc5) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch' 
    actionpack (3.1.0.rc5) lib/action_controller/metal.rb:236:in `block in action' 
    actionpack (3.1.0.rc5) lib/action_dispatch/routing/route_set.rb:65:in `call' 
    actionpack (3.1.0.rc5) lib/action_dispatch/routing/route_set.rb:65:in `dispatch' 
    actionpack (3.1.0.rc5) lib/action_dispatch/routing/route_set.rb:29:in `call' 
    rack-mount (0.8.2) lib/rack/mount/route_set.rb:152:in `block in call' 
    rack-mount (0.8.2) lib/rack/mount/code_generation.rb:96:in `block in recognize' 
    rack-mount (0.8.2) lib/rack/mount/code_generation.rb:68:in `optimized_each' 
    rack-mount (0.8.2) lib/rack/mount/code_generation.rb:95:in `recognize' 
    rack-mount (0.8.2) lib/rack/mount/route_set.rb:141:in `call' 
    actionpack (3.1.0.rc5) lib/action_dispatch/routing/route_set.rb:531:in `call' 
    oa-core (0.2.6) lib/omniauth/strategy.rb:44:in `call!' 
    oa-core (0.2.6) lib/omniauth/strategy.rb:30:in `call' 
    oa-core (0.2.6) lib/omniauth/strategy.rb:44:in `call!' 
    oa-core (0.2.6) lib/omniauth/strategy.rb:30:in `call' 
    oa-core (0.2.6) lib/omniauth/strategy.rb:44:in `call!' 
    oa-core (0.2.6) lib/omniauth/strategy.rb:30:in `call' 
    oa-core (0.2.6) lib/omniauth/builder.rb:30:in `call' 
    exception_notification_rails3 (1.2.0) lib/exception_notifier.rb:34:in `call' 
    actionpack (3.1.0.rc5) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' 
    rack (1.3.2) lib/rack/etag.rb:23:in `call' 
    rack (1.3.2) lib/rack/conditionalget.rb:25:in `call' 
    actionpack (3.1.0.rc5) lib/action_dispatch/middleware/head.rb:14:in `call' 
    actionpack (3.1.0.rc5) lib/action_dispatch/middleware/params_parser.rb:21:in `call' 
    actionpack (3.1.0.rc5) lib/action_dispatch/middleware/flash.rb:243:in `call' 
    rack (1.3.2) lib/rack/session/abstract/id.rb:195:in `context' 
    rack (1.3.2) lib/rack/session/abstract/id.rb:190:in `call' 
    actionpack (3.1.0.rc5) lib/action_dispatch/middleware/cookies.rb:326:in `call' 
    activerecord (3.1.0.rc5) lib/active_record/query_cache.rb:62:in `call' 
    activerecord (3.1.0.rc5) lib/active_record/connection_adapters/abstract/connection_pool.rb:466:in `call' 
    actionpack (3.1.0.rc5) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
    activesupport (3.1.0.rc5) lib/active_support/callbacks.rb:392:in `_run_call_callbacks' 
    activesupport (3.1.0.rc5) lib/active_support/callbacks.rb:81:in `run_callbacks' 
    actionpack (3.1.0.rc5) lib/action_dispatch/middleware/callbacks.rb:28:in `call' 
    rack (1.3.2) lib/rack/sendfile.rb:101:in `call' 
    actionpack (3.1.0.rc5) lib/action_dispatch/middleware/remote_ip.rb:48:in `call' 
    actionpack (3.1.0.rc5) lib/action_dispatch/middleware/show_exceptions.rb:47:in `call' 
    railties (3.1.0.rc5) lib/rails/rack/logger.rb:13:in `call' 
    rack (1.3.2) lib/rack/methodoverride.rb:24:in `call' 
    rack (1.3.2) lib/rack/runtime.rb:17:in `call' 
    activesupport (3.1.0.rc5) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
    rack (1.3.2) lib/rack/lock.rb:15:in `call' 
    actionpack (3.1.0.rc5) lib/action_dispatch/middleware/static.rb:53:in `call' 
    rack-cache (1.0.2) lib/rack/cache/context.rb:132:in `forward' 
    rack-cache (1.0.2) lib/rack/cache/context.rb:243:in `fetch' 
    rack-cache (1.0.2) lib/rack/cache/context.rb:181:in `lookup' 
    rack-cache (1.0.2) lib/rack/cache/context.rb:65:in `call!' 
    rack-cache (1.0.2) lib/rack/cache/context.rb:50:in `call' 
    railties (3.1.0.rc5) lib/rails/engine.rb:455:in `call' 
    railties (3.1.0.rc5) lib/rails/railtie/configurable.rb:30:in `method_missing' 
    thin (1.2.11) lib/thin/connection.rb:84:in `block in pre_process' 
    thin (1.2.11) lib/thin/connection.rb:82:in `catch' 
    thin (1.2.11) lib/thin/connection.rb:82:in `pre_process' 
    thin (1.2.11) lib/thin/connection.rb:57:in `process' 
    thin (1.2.11) lib/thin/connection.rb:42:in `receive_data' 
    eventmachine (0.12.10) lib/eventmachine.rb:256:in `run_machine' 
    eventmachine (0.12.10) lib/eventmachine.rb:256:in `run' 
    thin (1.2.11) lib/thin/backends/base.rb:61:in `start' 
    thin (1.2.11) lib/thin/server.rb:159:in `start' 
    thin (1.2.11) lib/thin/controllers/controller.rb:86:in `start' 
    thin (1.2.11) lib/thin/runner.rb:185:in `run_command' 
    thin (1.2.11) lib/thin/runner.rb:151:in `run!' 
    thin (1.2.11) bin/thin:6:in `<top (required)>' 
    /usr/local/rvm/gems/[email protected]/bin/thin:19:in `load' 
    /usr/local/rvm/gems/[email protected]/bin/thin:19:in `<main>' 



NoMethodError (undefined method `text?' for nil:NilClass): 
    config/initializers/some_debug.rb:6:in `build_relation' 
    app/controllers/application_controller.rb:18:in `system' 

User.rb

# -*- encoding : utf-8 -*- 
class User < ActiveRecord::Base 
    attr_accessible :username, :email, :birthday, :firstname, :lastname, :phone, :website, :profile, :avatar, :password, :avatar_cache, :name, :last_seen, :arts_count, :cheapest, :most_expensive #, :email_verified, :crypted_password, :password_salt, :administrator, :id 

    # Virtual attributes 
    attr_accessor :password, :password_confirmation 

    belongs_to :cheapest, :class_name => "Art", :foreign_key => :cheapest 
    belongs_to :most_expensive, :class_name => "Art", :foreign_key => :most_expensive 

    has_many :blogs, :dependent => :destroy 
    has_many :arts, :dependent => :destroy 
    has_many :authentications, :dependent => :destroy 
    has_friendly_id :username, :use_slug => true 
    has_many :comments, :as => :commentable, :validate => :false 

    mount_uploader :avatar, AvatarUploader 
    before_save :encrypt_password 
    before_create { generate_token(:auth_token) } 
    after_create { send_account_activation } 

    validates_uniqueness_of :username, :email 
    validates_presence_of :username, :email 
    validate :password_length_without_authentications 
    validates_format_of :username, :with => /^[-a-z\d_]+$/, :message => "kun små bogstaver, tal og bindestreger. f.eks. galleri-toke" 
    validates_length_of :username, :maximum=>30, :message=>"Dit brugernavn må max være 30 karakter." 
    validates_length_of :username, :minimum=>3, :message=>"Dit brugernavn skal minimum være 3 karakter." 
    validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i 

    default_scope :order => "last_seen desc" #, :conditions => "username NOT LIKE 'robot'" 
    scope :with_arts, where("arts_count > 0") 
... 

사용자 내가 last_seen 열을 업데이트하고 logged_in 사용자를 저장 페이지를 새로 고침 할 때마다. 어떤 이유로 든 절약이 중단됩니다. 내 개발 서버에서 이것을 재현 할 수 없었습니다.

+1

사용자보기 코드에서 일부 코드를 게시하고 UserController에서 표시 할 수 있습니까? – arnep

+0

완료 ... 업데이트 된 질문보기 – atmorell

+0

스택 추적을 게시 할 수 있습니까? 오류가 발생한 행 번호가 도움이 될 수 있습니다. –

답변

18

솔루션 희망 : 유효성 검사 라인이를 말한다면 ...

validates :tag, :uniqueness => {:scope => :post} 

... 그때는이 같은 대신 연결 이름의 열 이름을 참조하도록 변경 ...

validates :tag_id, :uniqueness => {:scope => :post_id} 

레일 3.1.0.rc5에서 오류를 다시 생성하고 동일한 오류 메시지가 나타납니다. 간단한 설명은 build_relation 메소드의 코드가 연관 이름이 아닌 리터럴 열 이름을 요구한다는 것입니다.코드 조각을 포함하여보다 철저한 설명은

대답의 대부분을 주신 http://thetenelements.blogspot.com/2011/08/undefined-method-text-for-nilnilclass.html

+0

나는 아이들에 대한 검증이 없다. 내가 발견 할 수있는 것은 validates_uniqueness_of : body, : scope => [: commentable_id, : user_id], : message => "Duplicate record .." – atmorell

2

여전히 해결할 수없는 경우 직접 build_relation 메소드에 디버깅을 추가하십시오. 실제로 콘솔에 데이터를 써서 실제로 잘못되어있는 부분을 보도록하십시오.

변경

def build_relation(klass, table, attribute, value) #:nodoc: 
    column = klass.columns_hash[attribute.to_s] 
    value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s if column.text? 

def build_relation(klass, table, attribute, value) #:nodoc: 
    puts "build_relation klass: #{klass.inspect}" 
    puts "build_relation table: #{table.inspect}" 
    puts "build_relation attribute: #{attribute.inspect}" 
    puts "build_relation value: #{value.inspect}" 
    puts "build_relation columns_hash: #{klass.columns_hash.inspect}" 
    column = klass.columns_hash[attribute.to_s] 
    value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s if column.text? 

에 그럼 당신은 적어도이 원인이되는 속성 것을 알 수 있습니다. 이제 그것이 잘못 동일마다 ...

+0

레일스 메소드를 오버라이드하려면 어떻게해야합니까? 이 메소드를 응용 프로그램 컨트롤러에 넣어야합니까? – atmorell

+0

이 디버깅의 경우 오류를 제기하는 파일을 편집하기 만하면됩니다. –

+0

나는이 같은 오류가 있습니다. 관계 검증이 없지만 별칭 속성에 대한 유효성 검사가 있습니다. 앨리어스 관계를 구축하면이 문제가 발생할 수 있습니까? 그렇다면 문제를 어떻게 해결합니까? – Altonymous

4

누가 복음 그리피스에서 내 블로그를 참조하십시오. 본질은 이것입니다. 당신은 어딘가에서 유일성 검증을합니다. 귀하의 의견에 따라 당신이 가지고있는 유일한 사람이 하나입니다 : 그런 경우

validates_uniqueness_of :body, :scope => [:commentable_id, :user_id], :message => "Duplicate record.." 

는, 우리는 (그것을 검증 이었다는 것을, 또한에 도움이되는 모델을 알고 도움이 범인이라고 가정한다 사용자 모델 코드의 관련 부분과 해당 유효성 검사가있는 모델의 관련 부분을 참조하십시오. 그러나 우리는 문제가 무엇인지 추측 할 수 있습니다.

레일 소스 rails/activerecord/lib/active_record/validations/uniqueness.rb 라인 57의 build_relation 메서드에서 발생하는 문제입니다.이 메서드는 특성 이름을 기반으로 열을 조회 한 다음 텍스트인지 확인하려고 시도합니다. 오류는 열 속성이인 열 해시에없는 것으로 보이므로 발생합니다.

다른 대답으로는 build_relation 메소드에서 디버깅 정보를 출력하는 것이 좋습니다. 이것은 나쁜 생각이 아닙니다 (실제로 알고 있어야하는 것은 columns_hash의 키가 무엇인지, 메서드로 전달되는 속성의 값이 무엇인지), 여기 어떻게 수행하는지입니다. config/initializers에 이니셜 라이저를 작성하고 debugging_stuff.rb으로 전화를 걸 수 있습니다. 이 안에는 다음과 같은 넣을 수 있습니다 :

ActiveRecord::Validations::UniquenessValidator.class_eval do 
    def build_relation(klass, table, attribute, value) #:nodoc: 
    puts "************** #{attribute}" 
    puts "************** #{klass.columns_hash.keys.inspect}" 
    column = klass.columns_hash[attribute.to_s] 
    value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s if column.text? 

    if !options[:case_sensitive] && value && column.text? 
     # will use SQL LOWER function before comparison 
     relation = table[attribute].lower.eq(table.lower(value)) 
    else 
     value = klass.connection.case_sensitive_modifier(value) 
     relation = table[attribute].eq(value) 
    end 

    relation 
    end 
end 

우리가 찾고있는 것은 columns_hash에있는 키 중 어느 것도 전달되는 속성 값과 일치하지 않을 때 찾을 것이다.

위의 유일성 검사기가 실제로 유일한 것일 경우, 거기에있는 세 가지 속성 중 하나 여야합니다 (:body, :commentable_id, :user_id). 내 돈은 :body에 있지만 잘못 될 수 있습니다. :body은 다른 모델을 나타냅니다. 루크 그리피스 (Luke Griffiths)가 지적한대로 아마 :body_id 일 것입니다. 그래도 문제를 찾을 수없는 경우에는 전체 스택 추적 및 관련 모델 (사용자 등)에 대한 코드와 같은 더 많은 디버깅 정보를 제공해야합니다. 우리는 보유한 정보로 가능한 한 멀리갔습니다.

관련 문제