通过CRUD获取请求从Rails传递到Javascript时丢失数据



我正在尝试登录用户,并且能够通过fetch请求成功地将登录数据从JavaScript前端发送到Rails后端。我相信我成功地在后端启动了一个会话,并试图将成员信息传递回前端,但是当我查看从json传递回来的响应时,它也不包括成员信息。它确实返回状态:200,但我找不到'成员'数据。

另外,在JS端跟踪成员会话的最好方法是什么?

这是我的Ruby on Rails会话控制器:
class SessionsController < ApplicationController
include CurrentMemberConcern
def create
@member = Member
.find_by(email: session_params[:email])
.try(:authenticate, session_params[:password])
if @member 
login!
render json: {
status: :created, 
logged_in: true,
member: @member 
}
else 
render json: { 
status: 401,
errors: ['No such member', 'Verify credentials and try again or sign up']
}
end
end
def is_logged_in? 
if logged_in? && current_member
render json: {
logged_in: true,
member: current_member
}
else
render json: {
logged_in: false,
message: 'no such member'
}
end
end
def destroy
# session[:member_id] = nil
logout!
render json: { 
status: 200, 
logged_out: true 
}
end
def session_params
params.require(:member).permit(:email, :password)
end
end

我的应用控制器:

class ApplicationController < ActionController::Base
# class ApplicationController < ActionController::API
skip_before_action :verify_authenticity_token #added because javascript frontend doesn't using js for frontend.  A rails frontend would auto-create this authenticity token. 
helper_method :login!, :logged_in?, :authorized_member?, :logout!, #current_member (current_member is currently in controller/concerns)
def login!
session[:member_id] = @member.id
end
def logged_in?
if @current_member
render json: {
logged_in: true, 
member: @current_member
}
else
render json: {
logged_in: false
}
end
end

def authorized_member?
@member == current_member
end
end

和我的JavaScript取回请求:

async function submitLogin() {

let email = document.getElementById("login-email").value;
let password = document.getElementById("login-password").value;
const memberLogin = { member: { email, password } };
let options = {
method: "POST",
credential: "same-origin",
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin":
"file:///Users/awb/Coding/Flatiron/Projects/bookclub-javascript-rails-api/bookclub-frontend-javascript/index.html",
"Access-Control-Allow-Methods": "POST",
"Access-Control-Allow-Headers": "Content-Type, Authorization",
Accept: "application/json",
},
body: JSON.stringify(memberLogin),
};
fetch("http://localhost:3000/login", options)
.then((resp) => {
resp.json();
})
.then((result) => {
console.log(result);
// how do I track the session and find who is logged in on the javascript side?;
});
}

我想先这样试试:

render json: { member: { id: @member.id }, logged_in: true }, status: :created

或者你可以查看https://apidock.com/rails/v4.0.2/ActionController/MimeResponds/respond_with

class SessionsController < ApplicationController
respond_to :json

def create
....
if @member 
login!      
respond_with @member, status: :created 
else
...
end
end
end

@member将被序列化并作为JSON返回。在我看来,你不需要logged_in,因为如果状态被创建,并且你在响应中收到一个成员,那么它显然已经登录了。

最新更新