Pregunta

En mi modelo tengo los siguientes campos:

class Comment
  include Mongoid::Document

  field :author, type: String
  field :author_email, type: String
  field :author_url, type: String
  field :author_ip, type: String
  field :content, type: String

  validates :author, presence: true, length: { minimum: 4 }
  validates :content, presence: true, length: { minimum: 8 }
end

Y también tengo un formulario para enviar los campos que el "comentarista" puede proporcionar:

<%= form_for [@article, @article.comments.build] do |f| %>
  <div class='comment_content'>
    <%= f.text_area :content %>
  </div>

  <div class='comment_author_email'>
    <%= f.email_field :author_email %>
  </div>

  <div class='comment_author'>
    <%= f.text_field :author %>
  </div>

  <div class='comment_author_url'>
    <%= f.url_field :author_url %>
  </div>

  <div class='comment_submit'>
    <%= f.submit %>
  </div>
<% end %>

Se requieren los campos "autor" y "contenido", los otros se llenan automáticamente (pero funcionan). El problema es que cuando un usuario no llena el campo "URL", que es opcional, el modelo no guarda el comentario. Siguiendo mi controlador:

class CommentsController < ApplicationController
  def create
    @article = Article.find params[:article_id]
    @comment = @article.comments.create(comment_params)
    @comment.author_ip = request.remote_ip
    if @comment.save
      flash[:notice] = 'Comment published'
    else
      flash[:alert] = 'Comment not published'
    end
    redirect_to article_path(@article)
  end

  private
    def comment_params
      params.require(:comment).permit(:content, :author_email, :author, :author_url)
    end
end

El comentario no puede guardar, pero no se establece "alerta", ni "aviso". Parece que solo se bloquea y omite todo el método. Solo puedo guardar el comentario si se llena cada campo, de lo contrario fallará sin ningún mensaje.

¿Qué me estoy perdiendo?

¿Fue útil?

Solución

Lo primero que me viene a la mente es que estás guardando el comentario dos veces por alguna razón. Primero lo guarda cuando se usa @article.comments.create(comment_params) En vez de @article.comments.new(comment_params). Entonces el primer guardado falla sin flash.

También te recomendaría aplicar algunas pruebas para ver lo que no funciona o al menos usar el debugger gem Hornarse dentro del código en acción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top