NoMethodError(未定义方法`permit' for" note_id":String):

时间:2016-07-25 11:44:33

标签: api python-3.x ruby-on-rails-4

我在Rails4 / mongoid应用程序中遇到API问题。我需要通过API使用python 3脚本来操作数据,但我得到了

NoMethodError (undefined method `permit' for "note_id":String):
我尝试提交请求时出现

错误。

我的python代码看起来像这样

import requests
import json
    url = 'http://0.0.0.0:3000/api/v1/note_proc_logs.json'    
    payload = {'note_proc_log' : { 'note_id' : '120904'}}
    head = {"Authorization":"Token token=xxxxxxxxxxxxxxxxxxx"}
    r = requests.post(url, payload, headers=head)

API控制器

module Api
  module V1
    # This class does not inherit from ApplicationController like the rest to skip Devise authentication
    class NoteProcLogsController < ActionController::Base
      before_filter :restrict_access if Rails.env.development? == false

      respond_to :json

      def create
        Rails.logger.warn "note_proc_log_params: #{params}" if Rails.env.development?

        @note_proc_log = NoteProcLog.new(note_proc_log_params)

        respond_to do |format|
          if @note_proc_log.save
            format.json { render :show, status: :created, location: @note_proc_log }
          else
            format.json { render json: @note_proc_log.errors, status: :unprocessable_entity }
          end
        end
      end

      private
        def restrict_access
          authenticate_or_request_with_http_token do |token, options|
            ApiKey.where(access_token: token).exists? 
          end
        end

        # Never trust parameters from the scary internet, only allow the white list through.
        def note_proc_log_params
          params.require(:note_proc_log).permit(:note_id)
        end
    end
  end
end

我看到同样错误的问题很少,但无法找到解决问题的方法。

非常感谢任何帮助。

更新

Rails.logger.warn "note_proc_log_params: #{params}" if Rails.env.development?

给了我

W, [2016-07-25T15:10:38.362848 #48352] WARN -- : params: {"note_proc_log"=>"note_id", "format"=>"json", "controller"=>"api/v1/note_proc_logs", "action"=>"create"}

1 个答案:

答案 0 :(得分:0)

问题出在python脚本中。一个简单的python字典可以作为有效负载,但嵌套的字典似乎不是。

我的最终python脚本看起来像这样

import requests
import json

url = 'http://0.0.0.0:3000/api/v1/note_proc_logs.json'
payload='note_proc_log[chip_id]=120904&note_proc_log[test_timestamp]=2016-07-19T13:24:49'
head = {"Authorization":"Token token=xxxxxxxxxxxxxxxxxxxx"}
r = requests.post(url=url, data=payload, headers=head)

在Rails端,所有内容都将被视为字符串,因此无需添加额外的引号,即使对于包含空格的字符串,也必须为每个子属性指定父属性,并使用&分隔元素。

这对我有用,知道是否有其他/更好的方法来做这件事会很有趣,特别是如何包含一组数值。