我有类似问题跟踪系统的东西,其中存在问题并且他们有一些评论。
现在在一个页面上,我想给用户一个选项来编辑一些“问题”以及添加评论。编辑和问题是/edit之类的标准内容,但我也想创建评论并验证它是否为空白。
我发现我可以构建评论并为其制作表单,但是我应该如何同时检查问题属性和评论属性是否有效?因为每次更新后都应该有一条新评论,但如果问题属性无效,我不想创建新评论。
我有类似问题跟踪系统的东西,其中存在问题并且他们有一些评论。
现在在一个页面上,我想给用户一个选项来编辑一些“问题”以及添加评论。编辑和问题是/edit之类的标准内容,但我也想创建评论并验证它是否为空白。
我发现我可以构建评论并为其制作表单,但是我应该如何同时检查问题属性和评论属性是否有效?因为每次更新后都应该有一条新评论,但如果问题属性无效,我不想创建新评论。
您可以在各自的类中验证评论模型和问题模型。我不清楚您是否在问题中使用“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
我会通过首先向您的模型和模型添加fails_validation?
方法来检查问题来解决这个问题。 Issues
Comments
其次,您必须手动加载@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
不是最优雅的解决方案,但它应该可以工作。