如何使模型方法中的属性集在控制器中可用? attr_accessor 不工作?
How to make attribute set in model method available in controller? attr_accessor not working?
我的会话控制器方法(对于 API)使用模型方法生成令牌。接下来它应该使用 json 将令牌发送到前端。但是,在 render json
行,api_token
不再可用,而是 nil
。应该如何处理?
module Api
module V1
class ApiSessionsController < Api::BaseController
def create
user = User.friendly.find_by(email: create_params[:email].downcase)
if user && user.authenticate(create_params[:password])
user.create_api_token
render json: { api_token: api_token }, status: :ok
else
render json: {errors: "wrong credentials" }, status: :unauthorized
end
end
end
end
end
class User < ActiveRecord::Base
attr_accessor :api_token
has_secure_password
def create_api_token
begin
self.api_token = User.new_token
api_digest = User.digest(api_token)
end while self.class.exists?(api_digest: api_digest)
update_attributes(api_digest: api_digest, api_sent_at: Time.zone.now)
end
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
end
我认为这条线应该是这样的
render json: { api_token: user.api_token }, status: :ok
您的控制器代码引用了未定义的 api_token
变量,因此您收到 nil
我的会话控制器方法(对于 API)使用模型方法生成令牌。接下来它应该使用 json 将令牌发送到前端。但是,在 render json
行,api_token
不再可用,而是 nil
。应该如何处理?
module Api
module V1
class ApiSessionsController < Api::BaseController
def create
user = User.friendly.find_by(email: create_params[:email].downcase)
if user && user.authenticate(create_params[:password])
user.create_api_token
render json: { api_token: api_token }, status: :ok
else
render json: {errors: "wrong credentials" }, status: :unauthorized
end
end
end
end
end
class User < ActiveRecord::Base
attr_accessor :api_token
has_secure_password
def create_api_token
begin
self.api_token = User.new_token
api_digest = User.digest(api_token)
end while self.class.exists?(api_digest: api_digest)
update_attributes(api_digest: api_digest, api_sent_at: Time.zone.now)
end
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
end
我认为这条线应该是这样的
render json: { api_token: user.api_token }, status: :ok
您的控制器代码引用了未定义的 api_token
变量,因此您收到 nil