2012-04-06 1 views
2

У меня есть следующий метод application_controller:Когда я должен использовать пользователь before_filter vs helper_method?

def current_account 
    @current_account ||= Account.find_by_subdomain(request.subdomain) 
    end 

Должен ли я называть его помощью before_filter или helper_method? В чем разница между этими двумя и что я должен рассматривать с точки зрения компромиссов в этом случае?

Спасибо.

ОБНОВЛЕНИЕ ДЛЯ УЛУЧШЕНИЯ CLARITY

Я нахожу, что я могу пользователь по before_filter вместо helper_method в том, что я могу назвать контроллер определенные методы из моих взглядов. Может быть, это что-то в том, как я организовал мой код, так вот, что у меня есть:

контроллеры/application_controller.rb

class ApplicationController < ActionController::Base 

    protect_from_forgery 

    include SessionsHelper 

    before_filter :current_account 
    helper_method :current_user 

end 

хелперы/sessions_helper.rb

module SessionsHelper 

    private 

    def current_account 
    @current_account ||= Account.find_by_subdomain(request.subdomain) 
    end 

    def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 

    def logged_in? 
    if current_user 
     return true 
    else 
     return false 
    end 
    end 
end 

контроллеры/пробелы_controller.rb

class SpacesController < ApplicationController 

    def home 
    unless logged_in? 
     redirect_to login_path 
    end 
    end 
end 

просмотров/пространства/home.html.erb

<%= current_account.inspect %> 

В теории, это не должно работать, не так ли?

ответ

4

Нет связи между использованием before_filter или helper_method. Вы должны использовать вспомогательный метод, когда у вас есть метод в контроллере, который вы хотите использовать повторно в своих представлениях, этот текущий_account может быть хорошим примером для helper_method, если вам нужно использовать его в своих представлениях.

+0

Я использую before_filter в этом методе в настоящее время и могу назвать это из своих представлений. Я что-то упускаю? – Nathan

+1

Если этот метод определен внутри контроллера, вы не можете его вызывать в представлении, если только вы не обращаетесь к переменной экземпляра ** @ current_account **, что было бы плохой практикой. –

+0

@ MaurícioLinhares, неправда. Если он называет 'helper_method: current_account' в контроллере, метод будет доступен в представлениях. – tsherif

3

Это две разные вещи. A before_filter - это то, что вы хотите называть как только перед началом действия. С другой стороны, вспомогательный метод часто повторяется, как правило, в представлении.

Этот метод, который у вас есть, просто прекрасен, чтобы оставаться там, где он есть.

+0

Что касается каждого из них, то вы говорите, что 'helper_method' не вызывает метод в памяти для каждого действия? Другими словами, он используется только как канал между представлением и методом и называется по мере необходимости с точки зрения? – Nathan

+0

Нет, программист называет «helper_method's» из представления (или других мест), когда они необходимы. Rails автоматически вызывает 'before_filter' перед действиями контроллера. – robbrit

1

Я решил свою проблему. Я новичок в Rails и не знаю, что методы, определенные в каталоге помощников, автоматически helper_methods. Теперь мне интересно, как это влияет на память/производительность. Но, по крайней мере, я решил загадку. Спасибо всем за вашу помощь!