我试图创建一条记录:
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
如果失败,则返回新的记录页面。但是,我正在寻找一种方法来暂时保存记录,即使它不是有效记录。我该怎么做?
除了暂时保存记录外,还有人可以解释新表单如何保留以前提交的所有数据吗?
答案 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