0

我有类似问题跟踪系统的东西,其中存在问题并且他们有一些评论。

现在在一个页面上,我想给用户一个选项来编辑一些“问题”以及添加评论。编辑和问题是/edit之类的标准内容,但我也想创建评论并验证它是否为空白。

我发现我可以构建评论并为其制作表单,但是我应该如何同时检查问题属性和评论属性是否有效?因为每次更新后都应该有一条新评论,但如果问题属性无效,我不想创建新评论。

4

2 回答 2

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 回答
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 回答