#javascript #ruby-on-rails #api #types
#javascript #ruby-on-rails #API #типы
Вопрос:
Я уже некоторое время пытаюсь решить эту проблему. Вот мой класс JS:
class Comment {
constructor(comment) {
this.id = comment.id
this.comment = comment
}
static createComment(e){
e.preventDefault()
const commentMessage = e.target.children[0].value
const commentList = e.target.previousElementSibling
Comment.submitComment(commentMessage, commentList)
e.target.reset()
}
renderComment(commentList){
const p = document.createElement('p')
p.dataset.id = this.id
p.innerText = "- " this.comment " "
}
static submitComment(commentMessage, commentList){
fetch(commentsURL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify({
comment: commentMessage
}),
})
.then(response => response.json())
.then(comment => {
let newComment = new Comment(comment)
newComment.renderComment(commentList)
})
}
}```
Который возвращает следующую ошибку из моего Rails API:
«NoMethodError (неопределенный метод `разрешить» для «comment»: String):
app/controllers/comments_controller.rb:24:в comment_params' app/controllers/comments_controller.rb:8:in
create'»
И вот этот контроллер:
class CommentsController < ApplicationController
def index
comments = Comment.all
render json: comments
end
def create
comment = Comment.new(comment_params)
if comment.save
render json: comment
else
render json: {errors: comment.errors.full_messages}
end
end
private
def comment_params
params.require(:comment).permit(:comment)
end
end
Любая помощь приветствуется, и я постараюсь сделать ее настолько ясной, насколько это необходимо.
Комментарии:
1. Решил это сам, просто добавив атрибут «text» в качестве строкового типа в мою базу данных. Это просто 🙂
Ответ №1:
Похоже, контроллер ruby пытается выполнить операцию с возвращаемой строкой, которая не является допустимым методом. Откуда вы взяли .permit()
? Может быть, спросить на форуме ruby?
Причина, по которой он возвращает [Object object], заключается в том, что вы ожидаете объект json в своем запросе на выборку. Обычно вы просто отображаете строку, возвращаемую из одного из значений в объекте json, но в данном случае это объект ошибки.
Ответ №2:
Вы публикуете свои комментарии с этим:
fetch(commentsURL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify({
comment: commentMessage
}),
})
Это означает, что вы отправляете JSON, подобный { "comment": "Comment text goes here..." }
Rails.
Затем в Rails вы пытаетесь распаковать это с помощью этого:
params.require(:comment).permit(:comment)
Это говорит о том, что «параметры должны иметь comment
поле и внутри этого comment
поля искать comment
поле». Итак, это ищет JSON следующим образом:
{
"comment": {
"comment": "Comment text goes here.."
}
}
Поэтому измените свой JSON в соответствии с вашим синтаксическим анализом параметров:
JSON.stringify({
comment: { comment: commentMessage }
})
или измените синтаксический анализ параметров в соответствии с вашим JSON:
params.permit(:comment)
Комментарии:
1. Спасибо. Я провел некоторый рефакторинг API, чтобы сделать его менее избыточным. Но, по-видимому, ошибка теперь исходит из интерфейса. Он продолжает возвращать [object Object] вместо строки. Я уже несколько дней пытаюсь решить эту проблему, и я очень расстроен. Если вы хотите углубиться в это, не стесняйтесь проверять весь репозиторий: github.com/Roeck/TEST1
2. Итак, что именно находится
commentMessage
на стороне JavaScript?3. «commentMessage» был атрибутом, который я использовал, пытаясь указать строковый тип данных, если это имеет смысл. Я только что удалил его, это не имело никакого значения. Подробно: внутри моего конструктора у меня есть «this.comment = comment», который отображает » [object Object]». Если я удалю эту строку, она отобразит «неопределенный». Если я использую «this.comment = comment.id «, он, очевидно, возвращает индексный номер отправленного комментария. Похоже, мы очень близки к решению
4. Но
createComment
вызываетsubmitComment
, и это просто захватываетe.target.children[0].value
. Итак, почемуe.target.children[0].value
JavaScript является строковым объектом?