2015-08-16 4 views
-1

С postgreSQL, если сбой при сохранении, мы можем вернуться false value.Как справиться с ошибкой при сохранении с помощью mongoid

Но с мангоидом разные.

Вы можете видеть, что я пытался сохранить новые записи, но получил Moped::Errors::OperationFailure.

Но я не мог обработать ошибку при этом условном потоке, он никогда не переходит в состояние else.

if @plan.save 
    flash[:info] = t('created_a_watch_list_successfully', scope: 'user_section') 
    else 
    flash[:alert] = t('plan_has_existing', scope: 'user_section') 
    end 

консоль

7] pry(#<User::TravelOrganizerController>)> rtn = @plan.save! 
     MOPED: 52.9.119.51:27017 INSERT  database=lazy_bird collection=plans documents=[{"_id"=>BSON::ObjectId('55cfd201506f63131f060000'), "is_enable"=>true, "from"=>"TAIPEI", "to"=>"TOKYO", "start_date"=>2015-11-16 00:00:00 UTC, "end_date"=>2015-11-21 00:00:00 UTC, "session"=>"all_day", "price"=>999.0, "user_id"=>BSON::ObjectId('55c61b64506f631cd2000000'), "updated_at"=>2015-08-15 23:58:01 UTC, "created_at"=>2015-08-15 23:58:01 UTC}] flags=[] 
           COMMAND  database=lazy_bird command={:getlasterror=>1, :w=>1} runtime: 52.3300ms 
    Moped::Errors::OperationFailure: The operation: #<Moped::Protocol::Command 
     @length=73 
     @request_id=36 
     @response_to=0 
     @op_code=2004 
     @flags=[] 
     @full_collection_name="lazy_bird.$cmd" 
     @skip=0 
     @limit=-1 
     @selector={:getlasterror=>1, :w=>1} 
     @fields=nil> 
    failed with error 11000: "E11000 duplicate key error collection: lazy_bird.plans index: user_id_1_from_1_to_1_start_date_1_end_date_1 dup key: { : ObjectId('55c61b64506f631cd2000000'), : \"TAIPEI\", : \"TOKYO\", : new Date(1447632000000), : new Date(1448064000000) }" 

    See https://github.com/mongodb/mongo/blob/master/docs/errors.md 
    for details about this error. 
    from /Users/hsu-wei-cheng/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/moped-2.0.4/lib/moped/operation/read.rb:50:in `block in execute' 

    [8] pry(#<User::TravelOrganizerController>)> rtn 
    nil 

ответ

0

OperationFalire является прямым результатом операции, такими, как неудачная вставка или недействительной команда.

Просто поймайте Exception.

begin 
    # success 
    @plan.save 
    flash[:info] = t('created_a_watch_list_successfully', scope: 'user_section') 
rescue OperationFailure => e 
    # failed to validate the new Document 
    flash[:alert] = t('plan_has_existing', scope: 'user_section') 
rescue 
    # some other error occurred, this rescue is optional 
end 
Смежные вопросы