Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 如何告知Sinatra在注册或登录后允许用户连接_Ruby_Login_Sinatra Activerecord - Fatal编程技术网

Ruby 如何告知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

我构建了一个运行正常的小型Sinatra应用程序,但我在注册表单中添加了一个
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中该列的名称应该是什么