ruby-on-rails - 使用 rails 构建登录 api 后端功能
问题描述
我有反应应用程序正在调用 ruby on rails。我正在构建登录页面,但我卡在了密码验证部分。出错
"#<ArgumentError: wrong number of arguments (given 0, expected 1)>"
错误发生在这一行
if user && user.authenticate(password)
这是 users_controller.rb
class Api::V1::UsersController < ApplicationController
before_action :authenticate_with_token!, only: [:logout]
def facebook
enter code hereif params[:facebook_access_token]
graph = Koala::Facebook::API.new(params[:facebook_access_token])
user_data = graph.get_object("me?fields=name,email,id,picture")
user = User.find_by(email: user_data['email'])
if user
user.generate_authentication_token
user.save
render json: user, status: :ok
else
user = User.new(
fullname: user_data['fullname'],
email: user_data['email'],
uid: user_data['id'],
provider: 'Facebook',
image: user_data['picture']['data']['url']
)
user.generate_authentication_token
if user.save
render json: user, status: :ok
else
render json: { error: user.errors, is_success: false}, status: 422
end
end
else
render json: { error: "Invalid Facebook Token", is_success: false}, status: :unprocessable_entity
end
end
def logout
user = User.find_by(access_token: params[:access_token])
user.generate_authentication_token
user.save
render json: { is_success: true}, status: :ok
end
def login
email = user_params[:email]
password = user_params[:password]
user = User.find_by(email: email)
if user && user.authenticate(password)
session[:user_id] = user.id
render json: user, status: :ok
else
render json: { error: user.errors, is_success: false}, status: 422
end
end
def add_card
user = User.find(current_user.id)
if user.stripe_id.blank?
customer = Stripe::Customer.create(
email: user.email
)
user.stripe_id = customer.id
user.save
else
customer = Stripe::Customer.retrieve(user.stripe_id)
end
customer.sources.create(source: params[:stripe_token])
render json: { is_success: true}, status: :ok
rescue Stripe::CardError => e
render json: { error: e.message, is_success: false}, status: :not_found
end
def user_params
params.require(:user).permit(:email, :password)
end
end
这是 routes.rb
Rails.application.routes.draw do
namespace :api, defautls: {format: :json} do
namespace :v1 do
get '/logout' => 'users#logout'
get '/login' => 'users#login'
post '/login' => 'users#login'
post '/signup' => 'users#signup'
end
end
end
这是 user.rb 模型
class User < ApplicationRecord
has_secure_password
before_create :generate_authentication_token
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable,
:validatable,
:confirmable, :omniauthable
validates :fullname, presence: true, length: {maximum:
50}
end
def generate_authentication_token
begin
self.access_token = Devise.friendly_token
end while self.class.exists?(access_token: access_token)
end
这是我发送的 json
{"email": "bearatamer+testfour@gmail.com", "password": "amer1234"}
解决方案
如果你看到你附加的控制台截图,你会注意到参数是:如果你仔细观察email, password, defaults
,user
你会看到它user
有一个哈希,它只包含电子邮件,没有密码。这给了我们一个提示。
现在,在您的 user_params 方法中:
def user_params
params.require(:user).permit(:email, :password)
end
在这里,params.require(:user)
将需要一个名为user
存在的键,它存在,否则将引发错误。接下来你有:它允许在父键的哈希值.permit(:email, :password)
中使用这两个参数。user
现在,在发送的 JSON 中似乎存在一些问题,要么您没有发布完整的 json,要么在发送之前或在将其处理给控制器之前正在转换您的 json(如果有人进行这种自定义,这是极不可能的,但是谁知道)。
解决方案:如果我是你,我会仔细检查我的 json,或者事实上我只会发送这个 json:{"user": {"email": "bearatamer+testfour@gmail.com", "password": "amer1234"}}
或者如果你不想在user
key 下嵌套,你必须require
从 key 上的强参数中删除user
。
推荐阅读
- flutter - 我的 Firestore 中的数据未显示
- typescript - 打字稿类型推断与设置
- github-api - 如何使用 Github API 创建和删除个人访问令牌?
- xamarin - 如何在页面之间共享视图模型?
- python - 使用 GridSearchCV 进行神经网络的超参数调优
- javascript - 使用 Google Analytics 跟踪我的下载
- javascript - 使用 JavaScript 在 Materialise CSS 多选中检索选定的值
- node.js - 在 Nest.js 应用程序中使用工作线程的正确方法
- merge - 在 SAS 中合并多个不完整的记录
- python - 如何展开 PyTorch 张量?