1

我的应用程序中有 2 个不同的控制器应该访问同一个会话对象。目前我正在使用:active_record_store,因为我不想使用数据库来获取我的用户。

我正在做这样的事情:

api 控制器获取用户电子邮件并创建用户对象(有效?、哈希和其他方法)

class ApiController < ApplicationController
  def login
    user = Requester.validate_email params[:email]
    if user.valid?
      session[:current_user] = user # works
      current_user = user           # dont work
      redirect_to app_root_path
    else
      redirect_to app_signup_path
    end
  end
end

家庭控制器将向用户显示一些页面,因为他已经“登录”了

class PagesController < ApplicationController

  def home
    puts "Home"

    # Everything here works fine
    puts session[:current_user].hash
    puts session[:current_user]
    puts session[:current_user].nil?

    # Nothing here works
    puts current_user.hash
    puts current_user
    puts current_user.nil?
  end
end

current_user方法current_user=位于ApplicationController

class ApplicationController < ActionController::Base
  protect_from_forgery

private 
  def current_user
    session[:user]
  end

  def current_user=(user)
    session[:user] = user
  end
end

我究竟做错了什么?为什么我不能session[:user]从私有方法内部访问?


在开发中使用 rails 3.2.11 和 sqlite3,在生产中使用 postgresql


编辑

我发现我的问题,显然我不能使用current_user = <some object>,如果我使用,current_user(<some object>)那么这将工作。

def current_user(user)
  session[:user] = user
end

def current_user=(user)
  session[:user] = user
end

def current_user
  session[:user]
end
4

1 回答 1

2

current_user = user # 这个设置变量 current_user with value = user

self.current_user = user # 这个调用方法 current_user=() with arg user

于 2013-04-12T14:24:45.680 回答