2011-12-29 3 views
1

У меня есть sessionController, и я пытаюсь добавить метод redirect_back_or в свой session_helper, чтобы разрешить дружественную пересылку.Сеанс Помощник Метод Не определено

Здесь ошибка я получаю:

undefined method `redirect_back_or' for #<SessionsController:0x007f9fa1b51ec0> 

Я перезагрузил сервер и не может понять, почему он не находит этот метод в моем помощнике.

Мой Сессии помощник код выглядит следующим образом:

module SessionsHelper 

    def deny_access 
     store_location 
     redirect_to signin_path, :notice => "Please sign in to access this page." 
    end 

    def redirect_back_or(default) 
     redirect_to(session[:return_to] || default) 
     clear_return_to 
    end 

    private 

    def store_location 
     session[:return_to] = request.fullpath 
    end 

    def clear_return_to 
    session[:return_to] = nil 
    end 

end 

Мой сессий контроллер

class SessionsController < ApplicationController 

    def create 
    auth = request.env["omniauth.auth"] 
    user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth) 
    session[:user_id] = user.id 
    redirect_back_or user 
    #redirect_to root_url, :notice => "Signed in!" 
    end 

    def destroy 
    session[:user_id] = nil 
    redirect_to root_url, :notice => "Signed out!" 
    end 

end 

ответ

2

Поместите этот метод в ApplicationController:

class ApplicationController < ActionController::Base 
    private 
    def redirect_back_or(default) 
     redirect_to(session[:return_to] || default) 
     clear_return_to 
    end 
end 

Или включают SessionsHelper модуль я n ваш контроллер использовать метод:

class SessionsController < ApplicationController 
    include SessionsHelper 
    ... 
+0

Вы создаете или назначаете вспомогательный метод, когда хотите использовать его в файле вида. Это правда, что вы можете поместить этот метод в 'ApplicationController', но если вы это сделали, вам не нужно объявлять его как' helper_method', чтобы получить доступ к нему с контроллера. Вы никогда не должны перенаправляться из файла вида, поэтому нет необходимости объявлять его как вспомогательный метод. – Batkins

+0

Да, вы правы, не следует перенаправлять из представлений. Я отредактирую. Я извлек из вспомогательного модуля и запутался. – clyfe

+0

Это также объясняет, почему использование методов внутри класса «SessionsHelper» не имеет никакого смысла ... Читайте здесь, чтобы узнать больше о том, когда использовать вспомогательные методы: http://paulsturgess.co.uk/articles/49- using-helper-methods-in-ruby-on-rails – Batkins

2

Вы пытаетесь вызвать метод, который находится в файле SessionHelper с вашего контроллера. Хелпер-файл предназначен для добавления методов, которые будут использоваться в представлении. Вы должны переместить метод redirect_back_or в SessionsController. Или, если вы хотите использовать этот метод несколько раз в нескольких контроллерах, может быть предпочтительнее поместить его в ваш ApplicationController. Я бы порекомендовал вам сделать то же самое с вашим методом deny_access. Это имеет смысл делать так или иначе, так как вы не будете перенаправляться из файла вида в любом случае.

+0

Хороший ответ, +1 – clyfe

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