rails和已保存表单中未保存的记录

时间:2014-08-19 14:51:45

标签: ruby-on-rails

我试图创建一条记录:

def new
  @usermodel = current_usermodel
  @profile = @usermodel.build_profile
end

def create
  @usermodel = current_usermodel
  @profile = @usermodel.create_profile(params[:profile]) 

  if not @profile.save
    flash.now[:error] = "Could not save your profile"
    render action: "new"
    return
  end
end

如果失败,则返回新的记录页面。但是,我正在寻找一种方法来暂时保存记录,即使它不是有效记录。我该怎么做?

除了暂时保存记录外,还有人可以解释新表单如何保留以前提交的所有数据吗?

3 个答案:

答案 0 :(得分:1)

注意:您的代码中有几个错误,我让自己假设那些是输入错误。如果没有,这个答案应该可以帮助你理解这些错误是什么。

我还假设您要“保存”模型,以便您可以重新显示错误。

真的很简单。首先是新行动:

def new
  @usermodel = current_usermodel
  @profile = @usermodel.build_profile
end

使用build_profile您正在创建新模型,但仅限于服务器内存中。此时,对象未保存在数据库中。您正在渲染表单,form_builder使用此仅内存模型来填充具有正确值的所有字段(通常它们是空白的)。一旦表单呈现,Rails就会回复html请求并销毁控制器,以及存储为此控制器的instance_variables的所有内存中对象。

现在,在您的创建操作中(应如下所示):

def create
 @usermodel = current_usermodel
 @profile = @usermodel.build_profile(params[:profile]) 

 if @profile.save
   ...
 else
   flash.now[:error] = "Could not save your profile"
   render :new
 end
end

您应该在这里再次使用build_profile。创建尝试保存它,因此您的代码执行两次db调用。同样,它将创建一个仅限内存的模型,但是这次通过将params[:profile]传递给它来填充从表单传递的属性。此时,内存中有有效/无效对象,其中包含所有已提交的参数。它是否保存到数据库是没有区别的。如果您知道render :new,它将呈现new视图,该视图具有在@profile对象上构建的表单。由于您在此操作中定义了此对象,因此不会引发任何错误,并且一切正常。

答案 1 :(得分:0)

此问题的解决方案是删除验证并使用after_update回调在更新后而不是在create上运行验证。您还可以使用一些方法来跳过验证。 ActiveRecord Validations Guides

此外,@usermodel.create_profile(params[:profile])未设置为实例变量@profile,但您不会要求保存@profile@profile永远不会保存{{1}},因此将始终遵循这一逻辑分支。

表单将表单的内容发布到网址。在rails中,params散列用于存储这些发布的值。 Rails足够聪明,可以将与params键匹配的字段重新填充到表单字段名称。

答案 2 :(得分:0)

要保存临时不良记录,您可以使用redis-rails的会话作为示例

session[:profile] = params[:profile]

然后,为了基本上解释表单提交的过程,您的表单值将发送到动作创建,在保存之前实例化您的个人资料。如果它没有满足验证的需要,rails会将对象保存在一个实例变量中,该变量将被发送到视图,因此您的表单

注意:

1.你的创建方法有问题,@ profile将始终等于nil,你需要在调用之前设置它:

@profile = @usermodel.profile
  1. 我建议你在这种情况下使用nested form