3

私のモデルには、次のフィールドがあります。

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

また、「コメント投稿者」が提供する可能性のあるフィールドを送信するためのフォームもあります。

<%= 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 %>

フィールド「作成者」と「コンテンツ」は必須で、他のフィールドは自動的に入力されます (ただし、機能しています)。問題は、オプションの「URL」フィールドにユーザーが入力しないと、モデルがコメントを保存しないことです。私のコントローラに続いて:

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

コメントの保存に失敗しましたが、「アラート」も「通知」も設定されていません。クラッシュしてメソッド全体をスキップするようです。すべてのフィールドが入力されている場合にのみコメントを保存できます。それ以外の場合は、メッセージなしで失敗します。

私は何が欠けていますか?

4

1 に答える 1

1

最初に頭に浮かぶのは、何らかの理由でコメントを 2 回保存していることです。@article.comments.create(comment_params)代わりに onを使用する場合は、最初に保存します@article.comments.new(comment_params)。したがって、最初の保存はフラッシュなしで失敗します。

また、いくつかのテストを適用して何が機能していないかを確認するか、少なくとも を使用してdebugger gem実際のコード内をこっそり確認することをお勧めします。

于 2013-11-07T05:33:08.850 に答える