NoMethodError:String的未定义方法'permit'
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NoMethodError:String的未定义方法'permit'相关的知识,希望对你有一定的参考价值。
我有一个带Rails API的React SPA。我最近在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';
,它也会将其作为字符串发送。在提出请求之前是否有其他方法可以正确转换params?
答案
尝试类似的东西:
def user_type_params
json = params.require(:validate_user)
{user_type: JSON.parse(json).permit(:user_type)}
end
此外,您不一定需要使用许可证。你可以自己将params列入白名单。
另一答案
事实证明,Axios转义嵌套JSON是一个众所周知的问题:axios/issues/738。
解决这个问题的方法是在我的api.js
中添加一个拦截器,例如:
axios.interceptors.request.use(config => {
config.paramsSerializer = params =>
qs.stringify(params, {
arrayFormat: 'brackets',
encode: false
});
return config;
});
这可以确保嵌套的params在将它们发送到Rails之前正确转换
以上是关于NoMethodError:String的未定义方法'permit'的主要内容,如果未能解决你的问题,请参考以下文章
Logstash: NoMethodError: 方法 `>=' for nil:NilClass Logstash