从未使用过current_user的setter方法

时间:2014-03-20 17:34:36

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

所以我正在构建一个我试图永远不需要数据库的应用程序,因为应用程序将只是一个API的门户。我有一个会话控制器,我正在尝试使用基于cookie的会话,但是setter方法永远不会被命中。这就是我现在所拥有的。

sessions_controller.rb

class SessionsController < ApplicationController

  def new
    if current_user
      redirect_to snapshots_path
    end
  end

  def create
    api = API.new
    response = api.authenticate_user(params[:session][:username].downcase, params[:session][:password])
    if response["Message"] == "success"
      current_user = response["User"]
      binding.pry
      redirect_to snapshots_path, notice: "Signed in successfully."
    else
      flash.now[:error] = "Invalid username/password combination."
      render :new
    end
  end

  def destroy
    current_user = nil
    redirect_to sign_in_path
  end

end

sessions_helper.rb

module SessionsHelper

  def current_user=(user)
    binding.pry
    if user
      @current_user = user
      cookies[:userdata] = { :value => user, :expires => 8.hours.from_now.utc }
    else
      @current_user = nil
      cookies.delete(:userdata)
    end
  end

  def current_user
    binding.pry
    @current_user ||= (cookies[:userdata] ? cookies[:userdata] : nil)
  end

end

每次都会正确命中getter方法,但是setter永远不会被命中。任何想法如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

当您分配给current_user时,它会将其视为局部变量。要解决这个问题,请简单地分配给self.current_user。 getter不需要它,因为没有名为local的变量,因此ruby会查找方法并使用它。如果您将getter引用为self.current_user也可以。

例如更改:

current_user = response["User"]

为:

self.current_user = response["User"]

答案 1 :(得分:0)

SessionsHelper中包含SessionsController,以便在SessionsController中访问SessionHelper方法。

代码无需任何修改即可正常使用,即您可以直接访问current_usercurrent_user=

class SessionsController < ApplicationController
 include SessionsHelper  ## Just add this
 ..
end