2017-02-06 6 views
0

レールアプリケーションでは、コントローラの動作メソッド内にブレークポイントを設定した後、一部のgibbereshを入力するとbyebug、 を入力すると、私のapplication_controller.rbのメソッドが自動的に実行されて印刷されます"未定義のローカル変数またはメソッド"レール内の呼び出し側をデバッグする

この魔法はどうやって起こっていますか?どのように私はこれをトレースんちんぷんかんぷんが入力されたときに...私は、このメソッドの実行を望んでいない...

(byebug) abcd1234abcd1234 
    WpPost Load (4.8ms) SELECT `wp_posts`.`post_title`, `wp_posts`.`post_date`, `wp_posts`.`post_name` FROM `wp_posts` WHERE `wp_posts`.`post_status` = 'publish' AND (post_date_gmt >= '2017-01-30 23:31:52.437270') ORDER BY post_date DESC LIMIT 3 
*** NameError Exception: undefined local variable or method `abcd1234abcd1234' for #<FooController:0x007fa717745bd8> 

nil 
(byebug) 

いくつかのコード

# foo_controller.rb 
class FooController < ApplicationController 

    def show 
    byebug # I type abcd1234abcd1234 at this prompt 
    # ... 

# application_controller.rb 
class ApplicationController < ActionController::Base 
    before_filter :something 
    before_filter :something2 
    before_filter :load_blog_posts, :something3 

    def .... 
    end 

    def load_blog_posts 
    @wp_posts = WpPost.where(post_status: 'publishh') 
        .where("post_date_gmt >= ?", Time.now - 1.week) 
        .order("post_date DESC") 
        .limit(3) 
        .select(:post_title, :post_date, :post_name) 
    end 
+1

興味深いことに、私のアプリケーションコントローラには多くのbefore_filtersがあります。最後のフィルタは実際にはWpPostを参照するメソッドへの呼び出しです。 –

+0

ええ、これは間違いなくこの動作を引き起こすフィルタです...問題が解決しますか? –

+0

問題はまだありません...私たちのアプリケーションの重要な部分ですので、私はそのフィルタを削除することはできません。 .. –

答えて

0

EDIT 2:

私は思いますSQLステートメントは単にログに遅れて出力しているだけです。

もう一度abcd1234abcd1234と入力するともう一度表示されますか?私はそれができるとは思わない。

また、ステートメントを変更してオブジェクトに良質な変更を加えることもできます。また、同時にrails cコンソールを実行すると、変更が既に発生していることがわかりますbyebugステートメントは、単にSTDOUTにまだ印刷されていません。

私はこのようなコードで全体のDBテーブルをロードすることによって、テストアプリでこれをテストすることができました:

def show 
    User.all 
    Thing.all 
    byebug 
end 

そして、私はこのになるだろう:

(byebug) ksjdfiisddjfj 
    User Load (0.5ms) SELECT "users".* FROM "users" 
    Thing Load (0.5ms) SELECT "things".* FROM "things" 

*** NameError Exception: undefined local variable or method `ksjdfiisddjfj' for #<ThingsController:0x007ff7cbe771e0> 

nil 
(byebug) sdfsdf 
*** NameError Exception: undefined local variable or method `sdfsdf' for #<ThingsController:0x007ff7cbe771e0> 

nil 
(byebug) 

EDIT:

フィルタの動作は継承されるため、継承するクラスのすべてのメソッドの前にapplication_controller内のすべてのbefore_actionが実行されます。そのコントローラから。ここで

は、ドキュメントへのリンクです: http://edgeguides.rubyonrails.org/action_controller_overview.html

はセクション8 Filtersを参照してください。

showメソッドの前に実行するアクションがない場合は、skip_before_action :load_blog_posts, only:[:show]を追加できます。私はあなたが何をしたいと思います

、最初before_actionとしてあなたbyebugコールをご紹介です。

1: class SomethingController < ApplicationController 
=> 2: before_action { byebug } 
    3: before_action :validate_current_something 
    4: before_action :validate_permissions_for_something, only: [ :edit, :update, :destroy ] 

これはあなたが探している状態を取得できるようになります...

+0

あなたの試行を感謝し、これは私を助けません。私が知りたいのは、誰がapplication_controller.rbを呼び出しているのですか?abcd1234abcd1234と入力するとload_blog_posts()が呼び出されます。 –

+0

'who's'はどういう意味ですか?コード内でそのメソッドがどのように呼び出されているのだろうか? 'before_action'がそのメソッドをどこかで呼び出すように思えます。あなたの行動のいずれかが他の行動を呼びますか? –

+0

私は説明に追加しました。 –

関連する問題