2016-07-25 9 views
0

Ich habe Probleme mit einer API in Rails4/Mongoid-Anwendung. Ich brauche die Daten mit einem Python-Skript 3 über eine API zu manipulieren, aber ich binNoMethodError (undefinierte Methode `erlauben 'für" note_id ": String):

NoMethodError (undefined method `permit' for "note_id":String): 

Fehler bekommen, wenn ich versuche, die Anforderung zu senden.

Meine sieht Python-Codes wie dieser

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) 

Die API-Controler

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 

ich einige Frage mit dem gleichen Fehler sah, konnte aber eine Lösung für mein Problem nicht finden.

Jede Hilfe würde sehr geschätzt werden.

UPDATE:

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

gibt mir

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"}

+0

Sie sind in der Entwicklung richtig? Können Sie das Ergebnis dieser Zeile posten? Rails.logger.warn "note_proc_log_params: # {params}" wenn Rails.env.development? Ich möchte das Format der Params sehen. – fabriciofreitag

+0

Ich denke, Ihre Payload erzeugt keinen richtigen Hash für Params – hgsongra

+0

Entfernen Sie Platz von Ihren Payload-Schlüssel und Doppelpunkt ':' in Ihrem 'Python-Code', hier die neue Paylod' Nutzlast = {'note_proc_log': {'note_id': '120904 '} ' – hgsongra

Antwort

0

Das Problem in der Python-Skript war. Ein einfaches Python-Wörterbuch ist als Payload in Ordnung, aber verschachtelte sind anscheinend nicht.

Meine letzte Python-Skript wie folgt aussehen

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) 

On Rails Seite alles wird als String behandelt werden, so dass keine Notwendigkeit für das Hinzufügen von zusätzlichen Anführungszeichen, auch für Strings mit Leerzeichen, übergeordnete Attribut hat für jeden angegeben werden Untergeordnete Attribute und Elemente getrennt mit &.

Das ist, was für mich funktioniert, wäre es interessant zu wissen, ob es andere/bessere Möglichkeiten gibt, es zu tun, insbesondere, wie man ein Array von Werten enthält.

Verwandte Themen