使用" skip_before_filter"在控制器中记录我

时间:2015-05-05 02:07:36

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个控制器动作需要使用AJAX调用。所以我使用skip_before_filter来关闭我为该特定呼叫登录的要求。

这有效,但在后续请求中,我被重定向到登录表单。我怎么能避免这个?

这是控制器中的过滤器代码:

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

1 个答案:

答案 0 :(得分:1)

使用before_filter的“except”子句可以使这更简单。

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

此外,“如果过滤器之前呈现或重定向,则操作将不会运行。如果计划在该过滤器之后运行其他过滤器,则它们也会被取消。”因此,抛弃过滤器的真/假方法,并使其成为渲染或重定向,以控制发生的事情。