11

REST API uygulamamın isteklerini günlüğe kaydetmeye çalışıyorum. Ben bunun gibi, ray bildirimleri kullanıyorum, bu gibi http://railscasts.com/episodes/249-notifications-in-rails-3raylar etkinleştirme bildirimleri - Yanlış db Çalışma zamanı değeri

Bir sorunun ray bildirimleriyle nasıl çözüleceğini anlayamıyorum.

benim başlatıcı kodu

ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, start, finish, id, payload| 
p name 
p start 
p finish 
p id 
p payload 
end 



Controller respond section 

    class PostsController < ApplicationController 
     # GET /posts 
     # GET /posts.json 

     respond_to :json, :html 
    .... 
end 

Kontrolör oluşturmak eylem

def create 
    @post = Post.new(params[:post]) 
    @post.save! 
    respond_with(@post, :location => nil) 
end 

Konsol çıkış

"process_action.action_controller" 
2013-02-02 20:13:11 +0200 
2013-02-02 20:13:11 +0200 
"951b8999e9b71d4a8949" 
{:controller=>"PostsController", :action=>"create", :params=>{"utf8"=>"✓", "authenticity_token"=>"1WugY9gh6ZCRXjfBTuckye3c9XDvtCqMQ2JdBpCo88s=", "post"=>{"name"=>"post3", "title"=>"post3", "content"=>"post3"}, "commit"=>"Create Post", "action"=>"create", "controller"=>"posts"}, :format=>:html, :method=>"POST", :path=>"/posts", :status=>302, :view_runtime=>nil, :db_runtime=>0} 

sen görebileceğiniz gibi: db_runtime => 0

db_runtime => 4,727 Bunun sebebi nedir

ve nasıl yapabilirsiniz:

Ben

"process_action.action_controller" 
2013-02-02 20:22:51 +0200 
2013-02-02 20:22:51 +0200 
"bf2a3173c08a0fd9008e" 
{:controller=>"PostsController", :action=>"create", :params=>{"utf8"=>"✓", "authenticity_token"=>"1WugY9gh6ZCRXjfBTuckye3c9XDvtCqMQ2JdBpCo88s=", "post"=>{"name"=>"post3", "title"=>"post3", "content"=>"post3"}, "commit"=>"Create Post", "action"=>"create", "controller"=>"posts"}, :format=>:html, :method=>"POST", :path=>"/posts", :status=>302, :view_runtime=>nil, :db_runtime=>4.727} 

görebildiğim İskele

def create 
    @post = Post.new(params[:post]) 
    #@post.save! 
    #respond_with(@post) 
    respond_to do |format| 
     if @post.save 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
     format.json { render json: @post, status: :created, location: @post } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

varsayılan denetleyici eylem kodunu değiştirmek Ancak eğer İlk örnekte çalışmasını sağlamak için düzeltin mi? Teşekkürler!

UPD

bundle show rails 
/Users/admin/.rvm/gems/ruby-1.9.3-p125/gems/rails-3.2.11 
rvm current 
ruby-1.9.3-p125 

Ben respond_with kullandığınızda çalışmıyor öyle görünüyor UPD2

! Birisi bana nedenini söyleyebilir mi? Teşekkürler

+0

merhaba Fivell, şimdi aynı şeyi üretmeye çalıştım. Burada response_with kullanarak ile ne alıyorum: Bildirim: process_action.action_controller 2013-02-06 13:59:21 +0600 2013-02-06 13:59:21 +0600 f2da3803410cccda546a {: controller => "PostsController",: action => "show",: params => {"action" => "show", "controller" => "posts", "id" => "12"},: format =>: html,: method = > "GET",: path => "/ posts/12",: status => 200,: view_runtime => 9.479712,: db_runtime => 0.267212} –

+0

raylar 3.2.11, ruby ​​1.9.3p194 (2012-04- 20 revizyon 35410) [x86_64-linux] –

+0

merhaba, GET ile çalışır, ancak POST – Fivell

cevap

2

Tamam, bir hata gibi görünüyor. Bakalım ne oluyor: Her şeyden

Öncelikle cleanup_view_runtime kanca AR denetleyicisi eylem için railtie ve kullanarak db_runtime ayarlamak için uygulanmasını var

def cleanup_view_runtime 
     if ActiveRecord::Base.connected? 
     db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime 
     runtime = super 
     db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime 
     self.db_runtime = db_rt_before_render + db_rt_after_render 
     runtime - db_rt_after_render 
    else 
     super 
    end 
end 

App denetleyicisi eylem çağrıları -> aksiyon bazı db sorguları yapıyor ve bazı şeyler oluşturur -> işlemden önce ve sonra AR Logger çalışma zamanı verilerini kaydeder. İyi.

Burada çok fazla kod gibi görünüyor

def respond_with(*resources, &block) 
    raise "In order to use respond_with, first you need to declare the formats your " << 
     "controller responds to in the class level" if self.class.mimes_for_respond_to.empty? 

    if collector = retrieve_collector_from_mimes(&block) 
    options = resources.size == 1 ? {} : resources.extract_options! 
    options[:default_response] = collector.response 
    (options.delete(:responder) || self.class.responder).call(self, resources, options) 
    end 
end 

def self.call(*args) 
    new(*args).respond 
end 

def to_format 
    if get? || !has_errors? || response_overridden? 
    default_render 
    else 
    display_errors 
    end 
rescue ActionView::MissingTemplate => e 
    api_behavior(e) 
end 

respond_with nasıl işlediğini görelim, ancak bu sorun için çağrı yığını görmelisiniz: respond_with -> self.class.responder.respond -> self.class. responder.to_format -> default_render -> default_renderer raise ActionView :: MissingTemplate (çünkü sahip olmadığımız için). Şu anda, render yapmak için uygulamayı görebiliriz: json ve: xml (api_behaviour) ActionView :: MissingTemplate. İki kez .. cleanup_view_runtime kanca denir

Şimdi nasıl respond_with çalıştığını biliyorum, ama AR Logger biliyorum doesnt: o zaman şablon verileri hazırlandı ve bazı db sorgular çağrıldı, ancak default_renderer için (biz ActionView yakalamak :: bunun yararlı olacağını umuyoruz tüm şablon verileri işlemek için hazır olduğunu zaman ve hiçbir db sorguları)

Bazı dağınık açıklama en

db_rt_before_render = ActiveRecord::LogSubscriber.reset_runtime 
runtime = super # <-- here 
db_rt_after_render = ActiveRecord::LogSubscriber.reset_runtime 

ve api_behavour için (

fakat render proccess içinde MissingTemplate) :)

+1

Evet Dmitry, debugger bugün bulmam için bana yardımcı oldu, çözümle ilgili sorunu gördün mü bir saat önce https://github.com/rails/rails/issues/9215 – Fivell

+0

şimdi anlamaya çalışıyorum rayların hangi kısmında bildirimler için testler var – Fivell

+0

Fivell, link için teşekkürler! –

0

Rails enstrümanı, isteği Rack metal seviyesinde ambalajlayarak ve farklı metrikler için olayları kaydederek çalışır. Her iki durumda da, tüm blok standart enstrümantasyon ile sarılmalı ve takip edilmelidir.

Kaynağa kazandıktan sonra görebildiğim tek fark, save() vs. save!() Öğesini çağırmaktır. ActiveRecord'daki temel yöntem olayı abonelikleri farklı davranabilir gibi görünüyor.

Kaydet ve kaydet'i kullanmak için response_with() örneğini değiştirmeyi deneyin! ve db_runtime dosyasını düzgün bir şekilde kaydedip kaydetmediğine bakın. Eğer öyleyse, bu bir Rails hatasıdır ve kaydetmeyi taklit ederek etrafta çalışabilirsiniz! özellikleri kullanarak kaydet.

+0

Kaydedilen değişiklikleri değiştirdim! kaydetmek için, ama hala çalışmıyor ( – Fivell

+0

Cevap_kullanarak kullandığımda işe yaramıyor gibi görünüyor, ama neden .... – Fivell

+0

Ben de şaşırıyorum.Çok pes etmeyin. – Winfield

0

GÜNCELLEME:

O

kendi Railtie böyle Active Record içine kanca yazma sürece olmaz, ancak Active Record neler kopyalayarak biraz daha karmaşıktır .. basit değil ve bazı etrafında ince ayar gerekiyor. ..

1) Log Subscriber

2) Railtie

3) Controller Runtime

Ben bunu içine almaya başlamak için nasıl ipucu var umut:

Ama burada böyle yapar .

Şerefe!

+0

tam olarak nerede çözüm? response_with kullanmaya çalışın ve isteği gönderin ... – Fivell

+0

Güncellenmiş gönderiyi kontrol et .. –

+0

aslında raylarda bir hataya benziyor – Fivell

İlgili konular