NoMethodError:HTTParty的未定义方法“提交”

时间:2018-07-19 20:53:17

标签: ruby-on-rails ruby post httparty

我目前正在使用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"

1 个答案:

答案 0 :(得分:1)

首先,我为您准备了一些红宝石产品:

  1. 调用FormStack::Form.new().create_form时,实际上不需要()之后的.new -即使您排除了括号,ruby也知道不带任何参数的方法。
  2. 我不太确定您是如何从FormsController::display_form呼叫FormsController::create的,但是现在我只是假设您使用的是魔术。

无论如何,请继续回答我。如错误消息所述,该错误与您在没有submission方法的地方调用submission有关。有了这些知识,我们可以查看您在此行中调用的对象是什么:

@form.submission

您似乎在submission上呼叫@form。好吧,我们来看一下声明@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 get提供的方法。 get方法返回一个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,并且由于{{ 1}},这就是为什么您会收到错误消息。

基于此探索,我们可以看到解决方法是改为将submission设置为HTTParty::Response对象,我们可以通过将@form操作更改为:< / p>

FormStack::Form