2015-05-05 2 views
-1

У меня есть действие контроллера, которое мне нужно вызвать с помощью AJAX. Поэтому я использовал skip_before_filter, чтобы отключить требование о том, чтобы я вошел в систему для этого конкретного вызова.Использование «skip_before_filter» в контроллере logs me out

Это работает, но по последующим запросам я перенаправляюсь в форму для входа. Как я могу избежать этого?

Вот код фильтра в контроллере:

protect_from_forgery 
before_filter :logged_in? 
skip_before_filter :logged_in?, :only => [:toggle_waiver] 

Вот действие контроллера:

def toggle_waiver 
    @household = Household.find(params[:household_id]) 
    @household.update_attributes(:waive_latefee => params[:bool]) 
    render :nothing => true 
    end 

Метод logged_in? просто дом вырос один:

def self.authenticate(username, password) 
    user = find_by_username(username) 
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt) 
    user 
    else 
    nil 
    end 
end 

Есть лучший способ сделать это? (Я использую Rails 3 ... не судите меня) :-)

Вот метод logged_in? контроллера (от application_controller):

protected 
def logged_in? 
    unless session[:admin_id] 
    flash[:notice] = "Please log in." 
    redirect_to log_in_path 
    return false 
    else 
    return true 
    end 
end 

И session устанавливаются с помощью этого метода в контроллер сеансов:

def create 
    admin = Admin.authenticate(params[:username], params[:password]) 
    if admin 
     session[:admin_id] = admin.id 
     redirect_to root_url, :notice => "Logged in!" 
    else 
     flash.now.alert = "Invalid email or password" 
     render "new" 
    end 
    end 
+0

Не могли бы вы отправить свой метод 'logged_in?'? – spickermann

ответ

1

Вы можете сделать это намного проще, используя предложение «except» before_filter.

before_filter :logged_in, :except => [:toggle_waiver] 

Кроме того, «если перед фильтром оказывает или переадресовывает, действие не будет работать. Если есть дополнительные фильтры, запланированные для запуска после этого фильтра они также отменяются.» Таким образом, отбросьте истинный/ложный подход вашего фильтра и сделайте его либо рендерингом, либо перенаправлением в качестве контроля того, что происходит.

+0

Ya, который работает, чтобы вызвать действие, но я все равно выхожу из системы впоследствии ... – thermans

+1

Мое предположение было бы тогда, что вы вызываете logged_in даже при вызове toggle-waiver (что означает, что фильтры неверны). Это или у вас есть вторая функция logged_in, определенная где-то, и вызывается IT. Это классическая отладка, что иногда причина чего-то не имеет смысла, потому что вы принимаете что-то ложное - как будто функция logged_in, показанная выше, на самом деле называется так называемой. –

+0

Звонок работает для запуска действия. Это просто вызов _after_, который возвращается на страницу входа. Итак, как-то сбрасывается куки-файл сеанса. – thermans

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