我正在尝试使用我的 rails 控制台在我的控制器中调用公共 post 方法。
rails c
app.post '/servers/important_method'
这显然给了我:
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
有什么方法可以创建会话并调用该方法?
编辑:我可以创建一个视图并重新启动生产环境,但我想避免这种情况。
我正在尝试使用我的 rails 控制台在我的控制器中调用公共 post 方法。
rails c
app.post '/servers/important_method'
这显然给了我:
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
有什么方法可以创建会话并调用该方法?
编辑:我可以创建一个视图并重新启动生产环境,但我想避免这种情况。
这里的关键是识别app
的一个实例ActionDispatch::Integration::Session
,它包含ActionDispatch::TestProcess
并因此具有一个#session
方法,一旦你用请求唤醒它,它就会提供真实性令牌。
然后我们可以通过 helper 使用它,它本身是自己方法app::post
的简单包装器,它记录调用参数。app
#process
将所有这些部分放在一起,在 Rails 5 及更高版本中,我们可能会这样写:
app.get ''
token = app.session[:_csrf_token]
app.post '/servers/important_method', params: { authenticity_token: token }
旧版本 Rails 的注意事项:
由于我们在这里讨论的是集成测试 API,因此您可以在集成测试中使用类似的形式。升级旧版 Rails 应用程序(v4 和更早版本)时,您可能会发现以下测试代码失败:
post '/servers/important_method', authenticity_token: token
这应该修改为新语法,将参数包装在params: { ... }
.