Rails / Active Record FAILSAFE ошибка "Пользователь не может быть передан" - PullRequest
3 голосов
/ 15 сентября 2010

Использование Rails 2.3.2 (в данный момент не в хорошей ситуации для обновления) с ruby ​​1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0].Получение следующей ошибки при попытке сохранить при выполнении проверок на модели, если проверки :on => :update.Если я изменяю проверки на :on => :create и создаю новую запись, я не вижу ошибки, и у меня нет проблем с ее сохранением, если нет проверок.

Completed in 392ms (View: 10, DB: 296) | 200 OK [http://localhost/barfoos/update]
/!\ FAILSAFE /!\  Tue Sep 14 16:38:49 -0400 2010
  Status: 500 Internal Server Error
  User can't be referred
    /path/to/project/vendor/rails/activerecord/lib/active_record/session_store.rb:67:in `dump'
    /path/to/project/vendor/rails/activerecord/lib/active_record/session_store.rb:67:in `marshal'
    /path/to/project/vendor/rails/activerecord/lib/active_record/session_store.rb:123:in `marshal_data!'
    /path/to/project/vendor/rails/activesupport/lib/active_support/callbacks.rb:178:in `send'
    /path/to/project/vendor/rails/activesupport/lib/active_support/callbacks.rb:178:in `evaluate_method'
    /path/to/project/vendor/rails/activesupport/lib/active_support/callbacks.rb:166:in `call'
    /path/to/project/vendor/rails/activesupport/lib/active_support/callbacks.rb:93:in `run'
    /path/to/project/vendor/rails/activesupport/lib/active_support/callbacks.rb:92:in `each'
    /path/to/project/vendor/rails/activesupport/lib/active_support/callbacks.rb:92:in `send'
    /path/to/project/vendor/rails/activesupport/lib/active_support/callbacks.rb:92:in `run'
    /path/to/project/vendor/rails/activesupport/lib/active_support/callbacks.rb:276:in `run_callbacks'
    /path/to/project/vendor/rails/activerecord/lib/active_record/callbacks.rb:344:in `callback'
    /path/to/project/vendor/rails/activerecord/lib/active_record/callbacks.rb:249:in `create_or_update'
    /path/to/project/vendor/rails/activerecord/lib/active_record/base.rb:2539:in `save_without_validation'
    /path/to/project/vendor/rails/activerecord/lib/active_record/validations.rb:1009:in `save_without_dirty'
    /path/to/project/vendor/rails/activerecord/lib/active_record/dirty.rb:79:in `save_without_transactions'
    /path/to/project/vendor/rails/activerecord/lib/active_record/transactions.rb:229:in `send'
    /path/to/project/vendor/rails/activerecord/lib/active_record/transactions.rb:229:in `with_transaction_returning_status'
    /path/to/project/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction'
    /path/to/project/vendor/rails/activerecord/lib/active_record/transactions.rb:182:in `transaction'
    /path/to/project/vendor/rails/activerecord/lib/active_record/transactions.rb:228:in `with_transaction_returning_status'
    /path/to/project/vendor/rails/activerecord/lib/active_record/transactions.rb:196:in `save_without_unsaved_flag'
    /path/to/project/vendor/rails/activerecord/lib/active_record/transactions.rb:208:in `rollback_active_record_state!'
    /path/to/project/vendor/rails/activerecord/lib/active_record/transactions.rb:196:in `save_without_unsaved_flag'
    /path/to/project/vendor/plugins/active_scaffold/lib/extensions/unsaved_record.rb:15:in `save'
    /path/to/project/vendor/rails/activerecord/lib/active_record/session_store.rb:300:in `set_session'
    /path/to/project/vendor/rails/activerecord/lib/active_record/base.rb:1453:in `silence'
    /path/to/project/vendor/rails/activerecord/lib/active_record/session_store.rb:297:in `set_session'
    /path/to/project/vendor/rails/actionpack/lib/action_controller/session/abstract_store.rb:132:in `call'
    /path/to/project/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call'
    /path/to/project/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache'
    /path/to/project/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache'
    /path/to/project/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call'
    /path/to/project/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:361:in `call'
    /path/to/project/vendor/rails/actionpack/lib/action_controller/reloader.rb:9:in `call'
    /path/to/project/vendor/rails/actionpack/lib/action_controller/failsafe.rb:11:in `call'
    /Library/Ruby/Gems/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `call'
    /Library/Ruby/Gems/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `synchronize'
    /Library/Ruby/Gems/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `call'
    /path/to/project/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:106:in `call'
    /path/to/project/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call'
    /Library/Ruby/Gems/1.8/gems/rack-1.0.1/lib/rack/urlmap.rb:46:in `call'
    /Library/Ruby/Gems/1.8/gems/rack-1.0.1/lib/rack/urlmap.rb:40:in `each'
    /Library/Ruby/Gems/1.8/gems/rack-1.0.1/lib/rack/urlmap.rb:40:in `call'
    /path/to/project/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call'
    /Library/Ruby/Gems/1.8/gems/rack-1.0.1/lib/rack/content_length.rb:13:in `call'
    /Library/Ruby/Gems/1.8/gems/rack-1.0.1/lib/rack/handler/webrick.rb:50:in `service'
    /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
    /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
    /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
    /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:162:in `start'
    /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
    /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:95:in `start'
    /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:92:in `each'
    /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:92:in `start'
    /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:23:in `start'
    /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:82:in `start'
    /Library/Ruby/Gems/1.8/gems/rack-1.0.1/lib/rack/handler/webrick.rb:14:in `run'
    /path/to/project/vendor/rails/railties/lib/commands/server.rb:111
    /Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
    /Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `require'
    script/server:3

Модель выглядит следующим образом:

class Barfoo < ActiveRecord::Base
  default_scope :conditions => {:scoping_model_id => ScopingModel.current_version.id}
  belongs_to :scoping_model

  # validate is false to keep from attempting to validate Foobar on Barfoo save, as Foobar can be saved, even if invalid, unlike Barfoo.
  has_one :foobar, :validate => false
  validates_presence_of :foobar_id, :on => :create, :message => "can't be blank"
  validates_inclusion_of :accepted_an_agreement, :in => [true, false], :on => :update, :message => "please choose whether you agree or disagree"
  validates_presence_of :some_option_string, :on => :update, :message => "before agreeing, you must specify the some string", :if => Proc.new { |detail| detail.accepted_an_agreement == true }
  validates_presence_of :some_text, :on => :update, :message => "you must provide details if option is 'Other'", :if => Proc.new { |detail| detail.some_option_string == 'Other' }
end

То, что я указываю в качестве значений этих полей, не имеет значения, и, как отмечает Шэдвелл в своем комментарии ниже, оно похоже на сессию.Есть одна вещь, связанная с сеансами и пользователями, которую мы делаем в ApplicationController, которая может вызывать эту проблему, даже если раньше это никогда не было проблемой.ApplicationController выглядит следующим образом:

class ApplicationController < ActionController::Base
  include ExceptionNotifiable
  require 'something_that_defines_update_method_that_we_redefine_in_controller'
  include Userstamp

  ActionController::Base.session_options[:httponly] = true
  ActionController::Base.session_options[:secure] = true

  prepend_before_filter :user_setting_method

  ...

  protected

  def user_setting_method
    session[:username] ||= optional_override_username
    session[:username] = session[:username]  # touch the session for timeout purposes
    @user ||= User.find_by_username session[:username]
    true
  end

  ...

end

Поиск ничего не дал о /!\ FAILSAFE /!\ с User can't be referred.Любая идея о том, что может вызвать это, и есть ли общие решения для этого или искать вещи, которые могут быть неправильными?

Обратите внимание, что прикрепленный к этому экземпляр foobar сохраняется, но в данном конкретном случае foobar ранее был сохранен задолго до этого, но не проверяется (был сохранен без проверки, что является нормальным возможным состоянием, поскольку это данные многостраничной формы, которые частично сохраняют данные, и пользователь может вернуться и исправить позжеотделка).

Ответы [ 2 ]

1 голос
/ 17 сентября 2010

После того, как я продолжил развивать модель, у меня появилась другая ошибка:

/!\ FAILSAFE /!\  Fri Sep 17 14:53:50 -0400 2010
  Status: 500 Internal Server Error
  can't dump hash with default proc

Я попытался сохранить модель в консоли и был успешным, но увидел некоторые странные вещи. Он просил, чтобы foobar_id был действительным (например), когда я уже установил действительный foobar для модели. Итак, я поговорил об этом с одним из членов команды и услышал, что он читал о проблемах, пытающихся проверить на идентификаторе связанного объекта, подобного этому.

Я удалил:

validates_presence_of :foobar_id, :on => :create, :message => "can't be blank"

и это сработало.

Но другой сотрудник предложил мне, чтобы у меня были проблемы, вероятно, связанные с выполнением validates_presence_of :foobar_id, когда в контроллере я пытался установить foobar:

barfoo.foobar = foobar

вместо настройки foobar_id как:

barfoor.foobar_id = foobar.id

Я также заметил, что в предыдущем примере он не устанавливал foobar_id в соответствующей строке в базе данных.

После изменения значения foobar_id на barfoo создается впечатление, что при создании и обновлении сохраняется экономия, если проверка обновления не выполняется. Однако, если я добавлю проверку, которая проверяет :on => :update, она завершится неудачей.

0 голосов
/ 14 ноября 2013

Я так поздно здесь. Но у меня тоже была та же проблема, и я получил временное решение для нее

Просто переопределите метод маршала в activerecord/lib/active_record/session_store.rb

ActiveRecord::SessionStore::ClassMethods.module_eval do
  def marshal(data)
    # To prevent from Marshal dump error
    begin       
      ::Base64.encode64(Marshal.dump(data)) if data
    rescue      
      # Checks for any ActiveRecord object in session variables and reloads it
      data.each_pair do |key,obj|
        if obj.is_a?(ActiveRecord::Base) || obj.is_a?(Array)
          unless obj.is_a?(Array)       
            data[key] = obj.reload              
            next                                
          end                           
          data[key].collect do |it_obj| 
            if obj.is_a?(ActiveRecord::Base)    
              it_obj.reload                             
            else                                
              it_obj                                    
            end                                 
          end                           
        end                     
      end               
      ::Base64.encode64(Marshal.dump(data)) if data
    end         

  end   
end

Проще говоря, он перезагрузит все объекты ActiveRecord, присутствующие в переменной сеанса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...