He estado tratando de resolver esto por un tiempo ahora. Aquí está mi clase 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) }) } }```Lo que devuelve el siguiente error de mi API de Rails:
"NoMethodError (método no definido `permit' para "comentario":String):
app/controllers/comments_controller.rb:24:en comment_params' app/controllers/comments_controller.rb:8:in create'"
Y aquí está ese controlador:
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 endCualquier ayuda es bienvenida e intentaré mantenerlo tan claro como sea necesario.
Parece que el controlador Ruby está intentando realizar una operación en la cadena de retorno que no es un método válido. ¿De dónde obtuviste el .permit() ? ¿Quizás preguntar en un foro de Ruby?
La razón por la que devuelve [objeto de objeto] es porque está esperando un objeto json en su solicitud de recuperación. Por lo general, solo representaría la cadena que se devuelve desde uno de los valores en el objeto json, pero en este caso es un objeto de error.
Publicas tus comentarios con esto:
fetch(commentsURL, { method: "POST", headers: { "Content-Type": "application/json", "Accept": "application/json", }, body: JSON.stringify({ comment: commentMessage }), }) Eso significa que está enviando JSON como { "comment": "Comment text goes here..." } a Rails.
Luego, en Rails, intenta desempaquetar eso con esto:
params.require(:comment).permit(:comment) Eso dice "los parámetros deben tener un campo de comment y dentro de ese campo de comment busque el campo de comment ". Eso es buscar JSON así:
{ "comment": { "comment": "Comment text goes here.." } }Así que cambie su JSON para que coincida con su análisis de parámetros:
JSON.stringify({ comment: { comment: commentMessage } })o cambie su análisis de parámetros para que coincida con su JSON:
params.permit(:comment)