【问题标题】:NoMethodError: undefined method `submission' for HTTPartyNoMethodError:HTTParty 的未定义方法“提交”
【发布时间】:2018-07-19 20:53:17
【问题描述】:

我目前正在开发一个 Rails 应用程序,我正在尝试将表单提交到 FormStack API。请求如下所示。

这是请求的样子:

POST /api/v2/form/12345/submission.json HTTP/1.1
Host: www.formstack.com
Authorization: Bearer YOUR_APP_OAUTH_TOKEN
Accept: application/json
Content-Type: application/json

field_12345=Example&field_12346=Answer

我正在尝试在我创建的库上使用 Httparty 来实现这一点,以向该 API 服务发出请求。

module FormStack

 class Form
    include HTTParty
    attr_reader :form_id
    base_uri "https://www.formstack.com/api/v2"

    def initialize
      @access_token = ENV.fetch('FORMSTACK_ACCESS_TOKEN')
      @form_id      = ENV.fetch('FORMSTACK_FORM_ID')
    end

    def create_form
      self.class.get(relative_uri, headers: headers)
    end

    def submission
      self.class.post(create_submission_uri, headers: headers, query: query)
    end

    private

    def relative_uri
      "/form/#{@form_id}/field.json"
    end

    def create_submission_uri
      "form/#{@form_id}/submission.json"
    end

    def headers
      {
        "Accept" => "application/json",
        "Content-Type"  => "application/json",
        "Authorization" => "Bearer #{@access_token}"
      }
    end

    def query
      {
        "field_66563890" => "blah",
        "field_66563757" => "something"
      }
    end
  end
end

控制器

class FormsController < ApplicationController
  def display_form
    @form = FormStack::Form.new().create_form
  end

  def create
    @form.submission
    redirect_to 'localhost:3000'
  end
end

这是路线

get '/forms/display_form', to: 'forms#display_form'
post '/forms/submit', to: "forms#create"

【问题讨论】:

    标签: ruby-on-rails ruby post httparty


    【解决方案1】:

    首先,我为你准备了一些通用的 ruby​​ 东西:

    1. 当您调用 FormStack::Form.new().create_form 时,您实际上不需要在 .new 之后使用 () -- ruby​​ 知道即使您排除了括号,也可以不带参数地调用该方法。
    2. 我不太清楚你是如何从FormsController::create 调用FormsController::display_form,但现在我假设你在使用魔法。

    不管怎样,继续我的回答。正如您的错误消息所述,该错误与您在没有 submission 方法的东西上调用 submission 有关。有了这些知识,我们可以在这一行中查看您正在调用提交的对象:

    @form.submission
    

    您似乎正在通过@form 呼叫submission。好,我们去看看你在哪里声明@form

    @form = FormStack::Form.new().create_form
    

    让我们把这个声明分解成几个部分。首先,使用FormStack::Form.new(),您正在创建FormStack::Form 的新实例。到现在为止还挺好。 FormStack::Form 定义了一个 submission 方法。但是,你打电话给create_form就可以了。那么,让我们看看create_form 做了什么:

    def create_form
      self.class.get(relative_uri, headers: headers)
    end
    

    create_form调用HTTParty提供的方法getget 方法返回一个 HTTParty::Response 对象。因此,让我们再次解析您设置@form 的行。分解一下,你在做的是这样的:

    @form = FormStack::Form # This line sets the variable to a constant
    @form = @form.new # This line sets the variable to be an instance of FormStack::Form
    @form = @form.create_form # This line sets @form to be an instance of HTTParty::Reponse
    

    如您所见,最后我们将@form 设置为HTTParty::Reponse 的实例而不是FormStack::Form,并且由于HTTParty::Response 没有submission 方法,这就是您收到错误的原因。

    基于此探索,我们可以看到解决方法是将@form 设置为FormStack::Form 对象,我们可以通过将display_form 操作更改为:

    def display_form
      @form = FormStack::Form.new
      @form.create_form
    end
    

    【讨论】:

    • 这是一个很好的解释。您指出并且我做错的一件事是控制器中的display_form 操作。我尝试使用 RESTful 方法,但 indexshow 似乎不适合我想要完成的任务。
    • show 似乎是您想要的,但为了真正评估这一点,我必须查看更多代码。如果您的代码正在运行,但您正在寻找使其更整洁/更 RESTful 的方法,您可以尝试在 Code Review Stack Exchange 上提问。
    猜你喜欢
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2013-04-16
    • 2023-03-20
    • 1970-01-01
    • 2021-07-31
    • 2020-04-06
    • 2022-01-13
    相关资源
    最近更新 更多