2017-02-06 103 views
0

在rails應用程序中,在使用byebug, 控制器的操作方法設置斷點後,當我鍵入一些gibberesh時,我發現在打印之前,我的application_controller.rb中的方法會自動執行「未定義的局部變量或方法」在rails中調試調用者

這種魔法是怎麼發生的?我如何追查這個......我不希望這種方法運行時胡言亂語鍵入...

(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

編輯2:

我想SQL語句只是將日誌打印到最近。

如果第二次輸入abcd1234abcd1234,是否會再次發生?我不認爲會。

此外,您可以嘗試更改語句以對對象進行某種良性更改,並且如果您同時運行控制檯rails c,則會看到該更改已經發生byebug聲明,它只是簡單地尚未打印到STDOUT。

我能夠通過加載整個數據庫表有這樣的代碼來測試這在測試應用程序:

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) 

編輯:

過濾器的行爲被繼承,所以您的application_controller中的每個before_action都會在每個繼承類的方法之前運行來自該控制器。

下面是該文檔的鏈接: http://edgeguides.rubyonrails.org/action_controller_overview.html

見部分8 Filters

如果您根本沒有在您的show方法之前運行該操作,那麼您可以添加一個skip_before_action :load_blog_posts, only:[:show]

我想你想要做什麼,是你的介紹電話byebug爲第一before_action:

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

感謝您的嘗試,這並不能幫助我。我想知道的是:當我輸入abcd1234abcd1234時,誰在調用application_controller.rb:load_blog_posts() –

+0

「who's'是什麼意思?你想知道如何在你的代碼中調用該方法嗎?這聽起來像一個'before_action'在某處調用該方法。你的行爲是否有其他行爲? –

+0

我添加到描述中,希望澄清事情 –