5

我正在尝试使用我的 rails 控制台在我的控制器中调用公共 post 方法。

rails c

app.post '/servers/important_method'

这显然给了我:

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

有什么方法可以创建会话并调用该方法?

编辑:我可以创建一个视图并重新启动生产环境,但我想避免这种情况。

4

1 回答 1

7

这里的关键是识别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: { ... }.

于 2014-12-02T17:28:17.523 回答