NoMethodError:字符串没有定义“许可”方法。

3

我有一个React SPA和一个Rails API。最近,我在React方面将API请求更改为通过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

每次在我的Rails代码中执行user_type_params[:user_type]这样的操作,都会出现如下错误:

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

即使我添加了request.headers ['Content-Type'] ='application / json';,它仍然将其作为字符串发送。在发出请求之前是否有其他方法可以正确转换参数?


在客户端尝试仅使用{ user_type: 'gamer' }作为有效载荷。我相信您没有遵循Rails控制器的约定。您应该发布控制器的片段。例如,如果您有用户控制器,则应执行params.require(:user).permit(:user_type),然后在客户端中,支付应仅为{user_type:“gamer”} - tkhuynh
@tkhuynh 如果您检查我上面定义的 def user_type_params,我在控制器中检查 params.require(:validate_user).permit(:user_type)。 - anonn023432
你的控制器名称是什么,请阅读更多关于Rails控制器的内容,你就会明白我的意思。 - tkhuynh
2个回答

0

尝试类似这样的内容:

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

另外,您不一定需要使用许可。您可以自己列出参数白名单。


有没有办法我可以在API包装类中编辑它?如果我在Rails端更改它,那么我就必须到处更改。 - anonn023432
尝试使用 JSON.stringify 处理参数,也许可以解决问题? - Aaditya Maheshwari
那没解决问题。我还是收到同样的错误 :/ - anonn023432
此外,这个问题只在stagingproduction环境下出现,所以我也不确定为什么会出现这种情况。 - anonn023432

0
原来Axios转义嵌套的JSON是一个已知问题:axios/issues/738
修复的方法是在我的api.js中添加一个拦截器,例如:
axios.interceptors.request.use(config => {
  config.paramsSerializer = params =>
    qs.stringify(params, {
      arrayFormat: 'brackets',
      encode: false
    });

  return config;
});

这确保了在将嵌套参数发送到Rails之前,它们会被正确转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接