2016-07-25 4 views
0

У меня проблемы с API в приложении Rails4/mongoid. Мне нужно манипулировать данные при помощи сценария Python 3 через API, но я получаюNoMethodError (неопределенный метод `allow 'для" note_id ": String):

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

ошибки, когда я пытаюсь отправить запрос.

Моих питона кода выглядит следующим образом

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) 

АНЯ контроллер

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 

Я видел несколько вопросов с той же ошибкой, но не смог найти решение моей проблемы.

Любая помощь была бы принята с благодарностью.

UPDATE:

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

+0

Вы находитесь в разработке правильно? Можете ли вы опубликовать результаты этой строки? Rails.logger.warn "note_proc_log_params: # {params}", если Rails.env.development? Я хотел бы видеть формат параметров. – fabriciofreitag

+0

Я думаю, что ваша полезная нагрузка не генерирует надлежащее хеш для параметров – hgsongra

+0

Удалите место из ваших ключей полезной нагрузки и двоеточия '' 'в ваш' код python', здесь новый paylod 'payload = {'note_proc_log': {'note_id': '120904 '} ' – hgsongra

ответ

0

Проблема была в сценарии питона. Простой словарь 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) 

On Rails со стороны все будет рассматриваться как строка поэтому нет необходимости для добавления дополнительных кавычек, даже для строк с пробелами, родительский атрибут не должен быть определен для каждого дочерний атрибут и элементы, разделенные &.

Это то, что работает для меня, было бы интересно узнать, есть ли другие/лучшие способы сделать это, в частности, как включить массив значений.

Смежные вопросы