在控制器中编写@ user.save是否安全

时间:2014-08-30 15:09:37

标签: ruby-on-rails ruby ruby-on-rails-4

假设我有一个模型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会失败的其他可能条件是什么,哪一个是良好做法。

3 个答案:

答案 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

来自文档:

create

  

尝试创建具有定义的相同范围属性的新记录   在这种关系中。如果验证失败,则返回初始化对象

save

  

....默认情况下,保存始终运行验证。如果其中任何一个失败了   操作被取消,保存返回false。但是,如果你供应   validate:false,完全绕过验证。

验证怎么办?

那么,

  1. 创建会尝试保存并无论如何返回已初始化的对象(验证后成功或失败保存)

  2. 保存会尝试保存并返回true表示成功保存,否则返回false

  3. 请注意,您可以通过传递false来保存

    来跳过验证
    @user.save(false)
    

    那么,条件呢?

    如果您选择跳过验证,使用创建保存(错误),那么您不需要条件,而如果您需要验证,那么您可能需要检查事情是如何进行的,然后给用户一些反馈,因此条件