2009-11-23 66 views
0

所以我有一個方法和相應的部分用於在我們網站的某些區域的邊欄中包含一組隨機照片。如何限制跨應用程序訪問方法?

現在我有一個random_photos方法在ApplicationController中設置一個before_filter

這樣做的意義在於,它使得random_photos方法的內容在我需要的地方可用,但它也不必要地執行一些複雜的SQL查詢,當我不知道它時(即,當我不需要時訪問那些隨機照片)。

那麼,我該如何限制random_photos方法的訪問呢,只有當我真的需要呢?

回答

0

還有一種選擇是使用skip_before_filter。這取決於你想要改變的控制器數量。如果只有少數幾個想要成爲例外的控制器,請使用skip_before_filter。如果有許多控制器要繞過過濾器,請使用其他建議之一。

class ApplicationController < ActiveController::Base 
    before_filter :random_photos 

    def random_photos 
    @photos = Photo.random 
    end 
end 

class OtherController < ApplicationController 
    skip_before_filter :random_photos 
    ... 
end 
2

您可以添加:如果條件的通話的before_filter,就像這樣:

class ApplicationController < ActiveController::Base 
    before_filter :random_photos, :if => is_it_the_right_time? 
0

你也可以在ApplicationControllerrandom_photos方法,並把before_filter在你的其他控制器。

class ApplicationController < ActiveController::Base 
    ... 
    def random_photos 
    @photos = Photo.random 
    end 
end 

class OtherController < ApplicationController 
    before_filter :random_photos, :only => 'show' 
    ... 
end 
0

這取決於有多少功能被利用的random_photos ...

如果少數然後使用vrish88的做法,但有after_filter

class ApplicationController < ActiveController::Base 
    after_filter :random_photos, :if => is_it_the_right_time? 
    ... 
    private 

    def is_it_the_right_time? 
    return @get_random_photos 
    end 
end 

class SomeController < ApplicationController 

    def show 
    @get_random_photos = true 
    ... 
    end 
end 

如果控制器每個功能將使用它,然後使用skip_before_filter或將控制器中的before_filter移出應用程序控制器。

許多方法來完成它,沒有一個更正確的,然後下一個。只是儘量保持它儘可能簡單和透明,所以你不會在幾個月後重新創建功能,因爲你忘記了所有部分的位置。

相關問題