假设我有一个模型User和一个控制器UsersController,
在我的创建动作中,我可以写
def create
@user = User.new(user_params)
@user.save
redirect_to root_path
end
或
@user = User.new(uer_params)
if @user.save
redirect_to users_path
else
render :new
end
复制以上2个更新操作并销毁
我的问题与第二次创作有关,
有必要添加if else end
。更糟糕的是,我只是创造了像第一个一样的行动。
注意: 请暂时忽略验证部分。
假设我没有任何验证。
除了验证之外,create / update / destroy会失败的其他可能条件是什么,哪一个是良好做法。
答案 0 :(得分:2)
鉴于您不想对保存的状态执行任何验证或任何检查,因此没有理由进行条件化。事实上,在这种情况下,@user
实例变量也没有理由。这就是你所需要的:
def create
User.create(user_params)
redirect_to root_path
end
条件是根据保存的状态做不同的事情。实例变量仅用于将User对象传递给视图。但是如果你总是在进行重定向,那么无论如何都不能使用实例变量,所以不需要。
这里的“正确”取决于您的应用程序的需求。在遇到问题之前,请做到最低限度,然后再修复它。
答案 1 :(得分:1)
这:
if User.create(user_params)
总是如此。无论是否成功创建,create
都会返回活动的reocrd对象。这就是我们通常做的原因:
@user = User.new(uer_params)
if @user.save
redirect_to users_path
else
render :new
end
另请注意,我们正在重定向到新操作。原因是我们已经有一个@user
变量,1)保存用户输入的所有属性2)附加了所有验证错误。我们需要做的就是渲染:new
模板,让Rails发挥其魔力。
注意:如果我们忽略验证,那么您将使用哪个选项没有区别。你不需要if / else语句,因为如果由于验证之外的任何其他原因而失败,它将抛出异常(除非你有/ before_save挂钩)。
答案 2 :(得分:1)
create
&之间的差异save
?
来自文档:
尝试创建具有定义的相同范围属性的新记录 在这种关系中。如果验证失败,则返回初始化对象
....默认情况下,保存始终运行验证。如果其中任何一个失败了 操作被取消,保存返回false。但是,如果你供应 validate:false,完全绕过验证。
验证怎么办?
那么,
创建会尝试保存并无论如何返回已初始化的对象(验证后成功或失败保存)
保存会尝试保存并返回true表示成功保存,否则返回false
请注意,您可以通过传递false来保存
来跳过验证@user.save(false)
那么,条件呢?
如果您选择跳过验证,使用创建或保存(错误),那么您不需要条件,而如果您需要验证,那么您可能需要检查事情是如何进行的,然后给用户一些反馈,因此条件