如何使用Rails控制台中的Devise登录用户?

Chr*_*ian 50 console ruby-on-rails devise

加载Rails控制台后,我该如何登录用户?

Devise提供了一个测试助手,可以在测试中使用,我试图在控制台中使用:

>> include Devise::TestHelpers
>> helper.sign_in(User.first)
Run Code Online (Sandbox Code Playgroud)

但我得到:

NoMethodError: undefined method `env' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)

无论如何,我想使用真正的设计助手而不是这个测试助手.有没有办法实现这个目标?

Bri*_*ing 83

这是我能够做到的一种方式:

>> ApplicationController.allow_forgery_protection = false
>> app.post('/sign_in', {"user"=>{"login"=>"login", "password"=>"password"}})
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

 >> app.get '/some_other_path_that_only_works_if_logged_in'
 >> pp app.response.body
Run Code Online (Sandbox Code Playgroud)

  • 使用现代Devise,您将不得不使用`email`而不是`login`:`app.post('/ sign_in',{"user"=> {"email"=>"login","password"=>"password" "}})` (2认同)
  • 在这种情况下“app”是如何初始化的? (2认同)

小智 16

这是另一个使用csrf令牌,验证用户身份并发出POST/GET请求的示例.

# get csrf token
app.get  '/users/sign_in'
csrf_token = app.session[:_csrf_token]

# log in
app.post('/users/sign_in', {"authenticity_token"=>csrf_token, "user"=>{"email"=>"foo", "password"=>"bar"}})

# get new csrf token, as auth user
app.get ''
csrf_token = app.session[:_csrf_token]

# make a POST request
app.post '/some_request.json', {"some_value"=>"wee", "authenticity_token"=>csrf_token}

# make a GET request
app.get '/some_other_request.json'
Run Code Online (Sandbox Code Playgroud)


小智 5

需要注意的是,从Rails 5开始,参数解析已更改为仅采用一个参数和参数(而不是参数作为第二个参数)。

ActionDispatch::ParamsParser 已弃用并已从中间件堆栈中删除。要配置参数解析器,请使用 ActionDispatch::Request.parameter_parsers=

因此,如果不修补中间件,这些早期的示例将不再适用于现代 Rails。要使它们工作,只需将参数包含在 POST 参数中,例如:

app.post('/users/sign_in', {"user"=>{"email"=>"me@mail.com", "password"=>"mycoolpassword"}}) <-- 不再有效

app.post('/users/sign_in', params: {"user"=>{"email"=>"me@mail.com", "password"=>"mycoolpassword"}})<--有效