Helper Funcation调用错误 - Ruby on Rails

时间:2015-08-26 13:04:42

标签: ruby-on-rails ruby ruby-on-rails-4

我正在尝试在Rails4中开发一个简单的登录/注销Web应用程序。我有以下会话助手的代码

module SessionsHelper

  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Returns the current logged-in user (if any).
  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end

  # Forgets a persistent session.
  def forget(user)
    user.forget
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
  end

   # Returns true if the user is logged in, false otherwise.
  def logged_in?
    !current_user.nil?
  end

  # Logs out the current user.
  def log_out
    forget(current_user)
    session.delete(:user_id)
    @current_user = nil
  end

  # Remembers a user in a persistent session.
  def remember(user)
    user.remember
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
  end
end

当我尝试注销时,它会调用控制器功能"忘记"而不是辅助功能。这是会话控制器类的注销代码。

  def destroy
    log_out if logged_in?
      redirect_to root_url
  end

  # Forgets a user.
  def forget
    update_attribute(:remember_digest, nil)
  end

1 个答案:

答案 0 :(得分:0)

那是对的。帮助程序混合到视图上下文中,而不是控制器上下文中,因此forget帮助程序在控制器中不可用。即使这样,控制器类中直接定义的任何方法都将替换包含的mixin提供的方法。

为什么不简单地在控制器本身中定义遗忘方法?你需要在其他地方使用吗?

作为旁注,您在控制器中创建的forget方法永远不会工作,因为您在没有接收器的情况下调用update_attribute因此接收器将是控制器本身,而它应该是当前的用户实例。

您的代码非常混乱。在尝试构建应用程序之前,您可能还想阅读一些Ruby / Rails书籍/课程。