2011-08-08 23 views
11

Tôi thấy một số lỗi ngẫu nhiên ngẫu nhiên với ứng dụng Rails 3.1 rc5 mới của tôi đang chạy ở chế độ sản xuất. Phần phụ trợ là nginx với 3 thể hiện mỏng.Thay đổi ngẫu nhiên các sự cố với Rails 3.1 trong sản xuất

[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' 

Tôi bật nhật ký: gỡ lỗi. Tuy nhiên, thông tin duy nhất là "Lỗi máy chủ nội bộ" Bất cứ ai nhìn thấy điều này trước đây? Bản đồ nhận dạng được bật om ...

Nếu tôi khởi động lại bản mỏng, Rails sẽ chạy mà không gặp sự cố trong vài giờ.

Update1: Dường như mọi hành động điều khiển của tôi tạo ra lỗi này một cách ngẫu nhiên. Sáng nay tôi nhận được một email với lỗi ở trên. Nếu tôi theo liên kết, trang sẽ được tạo mà không gặp vấn đề gì.

Tôi đã tự hỏi nếu vấn đề này bằng cách nào đó có thể liên quan đến các sự cố khi tải Người dùng từ cookie?

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 

Mã Ví dụ từ người # Hiển thị

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 

Update2 Đây là thông tin mà tôi có với debug thêm.

************** 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"] 

Đây là dấu vết ngăn xếp đầy đủ từ sự cố sáng nay.

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") 
... 

Mỗi khi người dùng làm mới trang để cập nhật cột last_seen và tiết kiệm cho người sử dụng logged_in. Vì lý do nào đó, việc tiết kiệm được. Tôi đã không thể tái tạo điều này trên máy chủ phát triển của mình.

+1

Bạn có thể đăng một số mã của mình từ chế độ xem # hiển thị của người dùng và hiển thị từ UserController không? – arnep

+0

Xong .. Xem câu hỏi đã cập nhật của tôi. – atmorell

+0

Bạn có thể đăng stack-trace không? Số dòng nơi lỗi xảy ra có thể hữu ích. –

Trả lời

18

giải pháp: nếu dòng xác nhận của bạn nói điều này ...

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

... sau đó thay đổi nó để tham khảo tên cột thay cho tên hiệp hội như thế này ...

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

tôi tái tạo thất bại của bạn trong đường ray 3.1.0.rc5 và sản xuất thông báo lỗi tương tự. Lời giải thích ngắn gọn là mã trong phương thức build_relation đang mong đợi một tên cột theo nghĩa đen, không phải là tên liên kết.

Đối với một lời giải thích kỹ hơn bao gồm các đoạn mã xem blog của tôi tại http://thetenelements.blogspot.com/2011/08/undefined-method-text-for-nilnilclass.html

+0

Tôi không có bất kỳ xác nhận nào về trẻ em. Điều duy nhất tôi có thể tìm thấy là: validates_uniqueness_of: body,: scope => [: commentable_id,: user_id],: message => "Bản ghi trùng lặp .." – atmorell

2

Nếu bạn vẫn không thể giải quyết việc này, hãy thêm một số gỡ lỗi vào chính phương thức build_relation. Chỉ cần để cho nó viết một số dữ liệu vào giao diện điều khiển để xem nơi nó thực sự đi sai.

Thay đổi

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? 

Sau đó, bạn sẽ ít nhất là biết những gì thuộc tính gây ra điều này. Bây giờ hy vọng đó là mỗi lần cùng nó đi sai ...

+0

Làm cách nào để ghi đè phương thức Rails? Tôi có nên đặt phương thức vào Bộ điều khiển ứng dụng của mình không? – atmorell

+0

Để gỡ lỗi này, chỉ cần chỉnh sửa tệp làm tăng lỗi. –

+0

Tôi gặp lỗi này. Tôi không có một xác nhận mối quan hệ, tuy nhiên tôi có một xác nhận trên một thuộc tính aliased. Có thể là xây dựng mối quan hệ bí danh gây ra vấn đề này? Nếu đó là trường hợp làm thế nào để bạn giải quyết vấn đề? – Altonymous

4

Luke Griffiths đã đưa cho bạn hầu hết các câu trả lời. Bản chất là điều này, bạn có một xác nhận tính duy nhất ở đâu đó. Theo nhận xét của bạn là người duy nhất bạn có là một trong những điều này:

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

Nếu đúng như vậy, thì chúng ta phải thừa nhận nó là thủ phạm (nó sẽ giúp để biết được mô hình mà xác nhận là, cũng sẽ giúp xem các phần liên quan của mã Mô hình người dùng của bạn cũng như các phần có liên quan của mô hình nơi tìm thấy xác thực đó). Nhưng dù chúng ta vẫn có thể đoán được vấn đề của bạn là gì.

Sự cố bạn đang gặp phải xảy ra theo phương pháp build_relation trong nguồn đường ray rails/activerecord/lib/active_record/validations/uniqueness.rb trên dòng 57. Phương pháp này đang tìm kiếm cột dựa trên tên thuộc tính và sau đó cố gắng xem đó có phải là văn bản hay không. Các lỗi xảy ra vì thuộc tính mà nó nhận được dường như không có trong giá trị băm cột với giá trị là column là không.

Điều này đã được đề xuất trong một câu trả lời khác mà bạn đưa ra một số thông tin gỡ lỗi trong phương thức build_relation. Đây không phải là một ý tưởng tồi (tất cả những gì bạn thực sự cần biết là các khóa trong cột_hash là gì và giá trị của thuộc tính được truyền vào phương thức), đây là cách bạn làm điều đó. Tạo trình khởi tạo trong config/initializers, cho phép gọi số đó là debugging_stuff.rb. Bên trong đó bạn có thể đặt như sau:

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 

Những gì chúng ta đang tìm kiếm là để tìm hiểu khi không ai trong số các phím trong columns_hash khớp với giá trị thuộc tính đó được thông qua.

Nếu trình xác thực tính duy nhất ở trên thực sự là người duy nhất bạn có, thì đó phải là một trong ba thuộc tính trong đó (:body, :commentable_id, :user_id). Tiền của tôi là số :body nhưng tôi có thể sai. :body có đề cập đến một mô hình khác không. Nếu nó có lẽ nó nên là :body_id như Luke Griffiths chỉ ra. Nếu bạn vẫn không thể tìm thấy vấn đề, bạn sẽ cần phải cung cấp thêm thông tin gỡ lỗi như, theo dõi ngăn xếp đầy đủ và mã cho các mô hình có liên quan (Người dùng, v.v.) - chúng tôi đã đi xa nhất có thể với thông tin chúng tôi có.

Các vấn đề liên quan