2009-11-23 3 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

Вы можете сохранить метод random_photos в ApplicationController и поставить 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 в контроллер и вне контроллера приложения.

Много способов сделать это, и нет более правильного, чем следующего. Просто постарайтесь сделать его максимально простым и прозрачным, чтобы вы не воссоздавали функциональные месяцы по дороге, потому что вы забыли, где находятся все части.

Смежные вопросы