"The action 'execute' could not be found for GraphqlController" 在仅 API 的 Rails 应用程序上使用 GraphQL 时?

"The action 'execute' could not be found for GraphqlController" when using GraphQL on an API only Rails app?

我已经在 rmosolgo/graphql-ruby 上发布了一个错误,但以防万一我可能做错了什么,我希望看看是否有其他人可以解决我的问题。

在创建仅 API 的 rails 应用程序时,似乎 Rails 认为我的 GraphqlController 中的 execute 方法丢失了。

这是我的 graphql_controller.rb 文件:

class GraphqlController < ApplicationController
  # If accessing from outside this domain, nullify the session
  # This allows for outside API access while preventing CSRF attacks,
  # but you'll have to authenticate your user separately
  protect_from_forgery with: :null_session

  def execute
    variables = ensure_hash(params[:variables])
    query = params[:query]
    operation_name = params[:operationName]
    context = {
      # Query context goes here, for example:
      # current_user: current_user,
    }
    result = RailsApiGraphqlExecuteTestSchema.execute(query, variables: variables, context: context, operation_name: operation_name)
    render json: result
  rescue => e
    raise e unless Rails.env.development?
    handle_error_in_development e
  end
# ... continues on
end

这是我的 routes.rb 文件:

Rails.application.routes.draw do
  post "/graphql", to: "graphql#execute"
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

当我 运行 rake routes 这是我得到的:

prompt> rake routes                                   
                               Prefix Verb   URI Pattern          Controller#Action
                              graphql POST   /graphql(.:format)   graphql#execute
... continues on

您应该能够通过以下命令行步骤重现此内容:

rails new execute-test --api
cd execute-test
vim Gemfile # or open an editor and add "gem 'graphql'"
bundle
rake db:create
rails g graphql:install
rake routes # to test that the route exists
rails s

当您使用像 GraphiQL 这样的应用程序并转到 http://localhost:3000/graphql 时,您将收到以下错误:

Started POST "/graphql" for 127.0.0.1 at 2019-10-15 16:23:29 -0700
   (0.3ms)  SELECT sqlite_version(*)

AbstractController::ActionNotFound (The action 'execute' could not be found for GraphqlController):
... strack trace continues ...

也许我做错了什么?任何帮助将不胜感激。

execute 方法中的这一行看起来像:

protect_from_forgery with: :null_session

是导致问题的原因。我得再研究一下。 +1,如果有人能弄清楚为什么会这样,我什至会将答案标记为正确。

编辑: 发生这种情况的原因是因为此方法假定您继承自 ActionController::Base 而不是 ActionController::API(没有这个方法)。 API class 应该更轻,因此不支持开箱即用的 cookies/sessions。