Ruby 如何告知Sinatra在注册或登录后允许用户连接
我构建了一个运行正常的小型Sinatra应用程序,但我在注册表单中添加了一个Ruby 如何告知Sinatra在注册或登录后允许用户连接,ruby,login,sinatra-activerecord,Ruby,Login,Sinatra Activerecord,我构建了一个运行正常的小型Sinatra应用程序,但我在注册表单中添加了一个confirm\u password,并在user\u controller中进行了更改,并破坏了一些东西。现在,即使输入了有效的用户名和密码,也不允许用户登录。他们再次进入登录/注册页面 我尝试使用binding.pry进行调试,因此我知道它正在将会话[:user\u id]分配给user.id,但我不确定它为什么一直要求用户凭据 这是我对用户的迁移: class CreateUsers < ActiveReco
confirm\u password
,并在user\u controller
中进行了更改,并破坏了一些东西。现在,即使输入了有效的用户名和密码,也不允许用户登录。他们再次进入登录/注册页面
我尝试使用binding.pry
进行调试,因此我知道它正在将会话[:user\u id]
分配给user.id
,但我不确定它为什么一直要求用户凭据
这是我对用户的迁移:
class CreateUsers < ActiveRecord::Migration[5.1]
def change
create_table :users do |t|
t.string :username
t.string :password_digest
t.string :email
t.timestamps
end
end
end
这是我的小费
class TipController < ApplicationController
use Rack::Flash
get '/:slug/tips' do
@user = User.find_with_slug(params[:slug])
if logged_in? && session[:user_id] == @user.id
erb :'/users/tips'
else
redirect to "/login"
end
end
get '/tips' do
erb :'/tips/tips'
end
get '/tips/new' do
if logged_in?
erb :'/tips/new'
else
redirect "/login"
end
end
post '/tips' do
@tip = current_user.tips.create(content: params[:content])
if @tip
if params[:language][:name].nil? || params[:language][:name].empty?
@tip.language_id = params[:tip][:language_id]
else
new_language = Language.create(name: params[:language][:name])
@tip.language_id = new_language.id
end
@tip.save
@user = @tip.user
redirect to "/tips/#{@tip.id}"
else
redirect "/tips/new"
end
end
get '/tips/:id' do
@id = params[:id]
if logged_in?
@tip = Tip.find_by_id(params[:id])
if !@tip.nil?
erb :'/tips/show'
else
erb :'/tips/show_error'
end
else
redirect "/login"
end
end
get '/tips/:id/edit' do
if logged_in?
@tip = Tip.find_by_id(params[:id])
if @tip.user.username == current_user.username
erb :'/tips/edit'
else
erb :'/tips/edit_error'
end
else
redirect "/login"
end
end
patch '/tips/:id' do
@tip = current_user.tips.find_by(params[:id])
if @tip
@tip.update(:content => params[:content])
if params[:language][:name].nil? || params[:language][:name].empty?
@tip.language_id = params[:tip][:language_id]
else
new_language = Language.create(name: params[:language][:name])
@tip.language_id = new_language.id
end
@user = @tip.user
@tip.save
# binding.pry
redirect "/tips/#{@tip.id}"
else
redirect "/tips/#{@tip.id}/edit"
end
end
get '/tips/:id/delete' do
@tip = Tip.find_by_id(params[:id])
if logged_in?
if current_user == @tip.user
@tip.destroy
redirect '/tips'
else
erb :'tips/delete_error'
end
else
redirect "/login"
end
end
get '/tips/:id/cancel' do
redirect "/tips/#{@tip.id}"
end
end
class TipControllerparams[:content])
如果参数[:语言][:名称].nil?|参数[:语言][:名称]。是否为空?
@tip.language\u id=params[:tip][:language\u id]
其他的
new_language=language.create(名称:params[:language][:name])
@tip.language\u id=新的\u language.id
结束
@user=@tip.user
@提示:保存
#捆绑,撬动
重定向“/tips/#{@tip.id}”
其他的
重定向“/tips/#{@tip.id}/edit”
结束
结束
获取“/tips/:id/delete”do
@tip=tip.find\u by_id(参数[:id])
如果你登录了?
如果当前用户==@tip.user
@提示:销毁
重定向“/tips”
其他的
雇员再培训局:“提示/删除错误”
结束
其他的
重定向“/登录”
结束
结束
获取“/tips/:id/cancel”do
重定向“/tips/#{@tip.id}”
结束
结束
当使用具有安全密码时,密码确认由ActiveRecord处理。创建用户时,您只需将密码和确认信息传递给用户:
user = User.create(username: params[:username], password: params[:password], password_confirmation: params[:confirm_password], email: params[:email])
如果密码不存在,ActiveRecord将返回一个未保存到数据库的无效用户。这就引出了我的下一点-User.create
不会抛出任何错误。如果希望抛出错误,请使用User.create代码>。否则,您应该在重定向之前验证您的用户:
user = User.create(username: params[:username], password: params[:password], password_confirmation: params[:confirm_password], email: params[:email])
return erb 'users/password_error' unless user.valid?
session[:user_id] = user.id
redirect to '/tips'
您还可以检查以下特定错误:
unless user.valid?
return erb 'users/password_error' if user.errors[:password].any?
return erb 'users/username_error' if user.errors[:username].any?
end
当使用具有\u安全\u密码时
,密码确认由ActiveRecord处理。创建用户时,您只需将密码和确认信息传递给用户:
user = User.create(username: params[:username], password: params[:password], password_confirmation: params[:confirm_password], email: params[:email])
如果密码不存在,ActiveRecord将返回一个未保存到数据库的无效用户。这就引出了我的下一点-User.create
不会抛出任何错误。如果希望抛出错误,请使用User.create代码>。否则,您应该在重定向之前验证您的用户:
user = User.create(username: params[:username], password: params[:password], password_confirmation: params[:confirm_password], email: params[:email])
return erb 'users/password_error' unless user.valid?
session[:user_id] = user.id
redirect to '/tips'
您还可以检查以下特定错误:
unless user.valid?
return erb 'users/password_error' if user.errors[:password].any?
return erb 'users/username_error' if user.errors[:username].any?
end
您的登录功能正在使用:id
而不是:user\u id
:
def logged_in?
!!current_user
end
def current_user
@current_user ||= User.find(session[:id]) if session[:id]
end
尝试将其更改为:
def logged_in?
!!current_user
end
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
您的登录功能正在使用:id
而不是:user\u id
:
def logged_in?
!!current_user
end
def current_user
@current_user ||= User.find(session[:id]) if session[:id]
end
尝试将其更改为:
def logged_in?
!!current_user
end
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
非常感谢您的建议,但是,我不需要在数据库中再添加一个密码列吗?如果是,迁移文件中该列的名称应该是什么?因为has_secured_password需要将password列命名为pssword_digest,而且rake db:migration不会让我有两个同名的列。@himachag不,你不需要更多的列了!ActiveRecord将对照:password\u confirmation
:password
检查它们是否匹配,但实际上它不会将:password\u confirmation
保存到任何地方。非常感谢您的建议。这比以前更有效。检查密码并相应地给出错误,但仍然给出相同的问题。它在注册中创建一个新用户,将会话[:user\u id]分配给user.id,但不允许任何人登录!还有其他建议吗?@HimaChhag您能发布处理“#{user.username}/tips”
的控制器的代码吗?如果是这样,请在其正上方添加以下行:set:session_secret,“328a79283uf1f2fu8932fu903uf9822f23f232”
非常感谢您的建议。试过了。没有帮助。我还用tip_控制器更新了我的问题。再次非常感谢。非常感谢你的建议,但是,我不也需要数据库中的另一个密码列吗?如果是,m中该列的名称应该是什么