在update_attributes上保存引用的资源(在编辑时创建嵌套资源)

时间:2012-05-20 15:29:29

标签: ruby-on-rails ruby-on-rails-3 activerecord nested

我有类似问题跟踪系统的问题,他们有一些问题。

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

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

2 个答案:

答案 0 :(得分:0)

我会首先向您的fails_validation?Issues模型添加Comments方法来检查问题。

其次,您必须从@issue手动加载params[]表单数据并在保存之前对其进行验证(无法使用update_attributes(params[:issue])。)创建新的{{1}并通过Comment加载它。然后,您可以在两个模型上测试验证,如果失败则返回params[]操作。

如果两者都通过,您可以正常保存edit然后@issue

@comment

不是最优雅的解决方案,但它应该有效。

答案 1 :(得分:0)

您可以在各自的课程中验证评论模型和问题模型。 我不清楚您是否在Issue中使用'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