所以我正在构建一个我试图永远不需要数据库的应用程序,因为应用程序将只是一个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永远不会被命中。任何想法如何解决这个问题。
答案 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_user
和current_user=
。
class SessionsController < ApplicationController
include SessionsHelper ## Just add this
..
end