NoMethodError: неопределенный метод 'allow' для String - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть React SPA с Rails API.Я недавно изменил свои запросы API на стороне React, чтобы проходить через axios вместо jquery, и моя установка axios:

export default class API {
  static send(verb, resource, rawParams, callback, errcallback) {
    const params = Object.keys(rawParams).reduce((o, k) => {
      o[k] = rawParams[k];
      return o;
    }, {});

    const errorCallback = typeof errcallback === 'function' ? errcallback : () => {};

    const request = {
      method: verb,
      url: `${URL}/${resource}`
    };

    const token = window.sessionStorage.getItem('jwt');
    request.headers = {};
    if (token !== 'undefined' && token != null) {
      request.headers.Authorization = `Bearer ${token}`;
    }

    if (verb === 'GET' || verb === 'DELETE') {
      request.params = params;
      request.headers['Content-Type'] = 'application/json';
      request.headers.Accept = 'application/json';
    } else {
      request.headers['Content-Type'] = 'application/json';
      request.headers.Accept = 'application/json';
      request.data = params;
    }

    axios(request)
      .then(response => {
        if (resource === 'users/sign_in') {
          const jwt = response.headers.authorization;
          window.sessionStorage.setItem('jwt', jwt.split('Bearer ')[1]);
        } else if (resource === 'users/sign_out') {
          window.sessionStorage.removeItem('jwt');
        }
        callback(response.data);
      })
      .catch(error => {
        errorCallback(error.response.data);
      });
  }

  static baseURL() {
    return URL;
  }

  static get(resource, params, callback, errcallback) {
    API.send('GET', resource, params, callback, errcallback);
  }

  static post(resource, params, callback, errcallback) {
    API.send('POST', resource, params, callback, errcallback);
  }

  static put(resource, params, callback, errcallback) {
    API.send('PUT', resource, params, callback, errcallback);
  }

  static del(resource, params, callback, errcallback) {
    API.send('DELETE', resource, params, callback, errcallback);
  }
}

И для этого я создаю запрос, такой как:

API.get('user/user_auth', { validate_user: { user_type: 'gamer' } }. res => {
  ...
}

Но теперь моя сторона Rails терпит неудачу в параметре разрешения.Разрешение определяется как:

def user_type_params
  params.require(:validate_user).permit(:user_type)
end

И каждый раз, когда я делаю что-то вроде user_type_params[:user_type] в своем коде Rails, я получаю ошибку, такую ​​как:

NoMethodError (undefined method `permit' for "{\"user_type\":\"gamer\"}":String)`

Он отправляет его какстрока, хотя я добавил request.headers['Content-Type'] = 'application/json';.Есть ли другой способ правильно преобразовать параметры перед выполнением запроса?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Оказывается, что Axios, выходящий из вложенного JSON, является известной проблемой: axios / Issues / 738 .

Чтобы исправить это, нужно добавить перехватчик в мой api.js такойas:

axios.interceptors.request.use(config => {
  config.paramsSerializer = params =>
    qs.stringify(params, {
      arrayFormat: 'brackets',
      encode: false
    });

  return config;
});

Это обеспечивает правильное преобразование вложенных параметров перед их отправкой в ​​Rails

0 голосов
/ 02 февраля 2019

Попробуйте что-то вроде:

def user_type_params
  json = params.require(:validate_user)
  {user_type: JSON.parse(json).permit(:user_type)}
end

Кроме того, вам не обязательно использовать разрешение.Вы можете внести в белый список параметры самостоятельно.

...