Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用rails构建登录api后端功能_Ruby On Rails_Ruby_Rails Api - Fatal编程技术网

Ruby on rails 使用rails构建登录api后端功能

Ruby on rails 使用rails构建登录api后端功能,ruby-on-rails,ruby,rails-api,Ruby On Rails,Ruby,Rails Api,我发现react应用程序正在调用ruby on rails。我正在建立登录页面,密码验证部分卡住了。获取错误 "#<ArgumentError: wrong number of arguments (given 0, expected 1)>" 这是从康曼线传来的 这是users_controller.rb class Api::V1::UsersController < ApplicationController before_action :authenticate_

我发现react应用程序正在调用ruby on rails。我正在建立登录页面,密码验证部分卡住了。获取错误

 "#<ArgumentError: wrong number of arguments (given 0, expected 1)>"
这是从康曼线传来的

这是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
下面是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
如果你看到你附加的控制台截图,你会注意到参数是:email,password,defaults和user如果你仔细看,你会发现这个用户有一个hash,它只包含email,没有密码。这给了我们一个提示

现在,在用户参数方法中:

def user_params
  params.require(:user).permit(:email, :password)
end
这里,params.require:user将要求一个名为user的密钥存在,该密钥存在,否则将抛出错误。接下来是:.permit:email,:password,它允许在父用户密钥的散列值中使用这两个参数

现在,在发送的JSON中似乎出现了一些问题,要么你没有发布完整的JSON,要么在发送之前,或者在将JSON处理给控制器之前,有什么东西正在转换你的JSON,如果有人进行这种定制,这是极不可能的,但谁知道呢


解决方案:如果我是你,我会仔细检查我的json,或者实际上我只发送这个json:{user:{email:bearatamer+testfour@gmail.com,password:amer1234}}}或者,如果不希望在用户密钥下嵌套,则必须从用户密钥上的强参数中删除require。

问题在于这一行

  if user && user.authenticate(password)
 if user && user.authenticate(password)
一旦我改成这个,它就起作用了

 if user && user.valid_password?(params[:password])

你能告诉我错误来自哪一行代码和哪一个文件吗?你能在堆栈跟踪中看到它吗?你能粘贴你的整个用户\控制器文件吗?错误来自于线路46@Mark我确实更新了我的问题。
 if user && user.authenticate(password)
 if user && user.valid_password?(params[:password])