0

問題があり、コメントがある問題追跡システムのようなものがあります。

ここで、1つのページで、「問題」の一部を編集したり、コメントを追加したりするオプションをユーザーに提供したいと思います。編集と発行は/editのような標準的なものですが、コメントを作成して空白でないかどうかを検証したいと思います。

コメントを作成してフォームを作成できることがわかりましたが、発行属性とコメント属性の両方が有効であることを同時に確認するにはどうすればよいですか?各更新の後に新しいコメントを付ける必要があるためですが、問題の属性が有効でない場合は、新しいコメントを作成したくありません。

4

2 に答える 2

0

私は最初にあなたとモデルfails_validation?の両方にメソッドを追加して問題をチェックする ことによってこれにアプローチします。IssuesComments

次に、@issueフォームデータを手動でロードし、params[]保存する前に検証する必要があります(使用できませんupdate_attributes(params[:issue]))。新しいデータを作成し、Commentを介してロードしparams[]ます。edit次に、両方のモデルで検証をテストし、どちらかが失敗した場合はアクション に戻ることができます。

両方が合格した場合は、保存@issueしてから@comment通常どおりに保存できます。

def update
  @issue = Issue.find(params[:id])
  # manually transfer form data to the issue model
  @issue.title = params[:issue][:title]
  @issue.body = params[:issue][:body]
  #...

  @comment = @issue.comments.new(params[:comment])

  # validate both @issue and @comment
  if @issue.fails_validation? || @comment.fails_validation?
    flash[:error] =  "Your edits or your comment did not pass validation."
    render :action => "edit", 
  end

  # validation passed, save @issue then @comment
  respond_to do |format|
    if @issue.save
      @comment.save
      format.html { redirect_to @issue, notice: 'Issue successfully updated. Comment created' }
      format.json { head :ok }
    else
      format.html { render action: "edit" }
      format.json { render json: @issue.errors, status: :unprocessable_entity }
    end
  end
end

最も洗練されたソリューションではありませんが、機能するはずです。

于 2012-05-21T05:34:59.300 に答える
0

コメントモデルと問題モデルをそれぞれのクラスで検証できます。コメントの発行で「accepts_nested_attributes_for」を使用しているかどうかはわかりません。その場合、問題が無効である場合、標準のIssueController#updateはレコードを保存しないため、コメントレコードも作成されません。

標準のIssueController#updateは次のとおりです。

class IssueController < ApplicationController

  def update
    @issue = Issue.find(params[:id])
    if @issue.update_attributes(params[:issue])
      redirect_to issues_path, notice: 'issue updated'
    else
      render action: 'edit'
    end
  end
于 2012-05-21T05:35:59.827 に答える