Рендеринг Javascript [object Object] как строковый тип данных

#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 является строковым объектом?