如何在update_attributes期间以管理员身份跳过validation?

当我尝试将用户编辑为管理员时,我想跳过validation。

模型

class User ... attr_accessible :company_id, :first_name, :disabled, as: :admin 

调节器

 class Admin::UsersController ... def update @user = User.find(params[:id]) @user.update_attributes(params[:user], as: :admin) redirect_to edit_admin_user_path(@user), :notice => "User Account Updated" end 

所以我尝试将update操作更改为

 def update @user = User.find(params[:id]) @user.attributes = params[:user] @user.save(validate: false) redirect_to edit_admin_user_path(@user), :notice => "User Account Updated" end 

但后来我没有访问set :disabled:company_id属性,因为我不知道在哪里设置as: :admin

试试这个:

 @user = User.find(params[:id]) @user.assign_attributes(params[:user], as: :admin) @user.save(validate: false) 

强参数

这已成为rails长期存在的问题,在Rails 4中它们引入了“强参数”

您也可以在rails 3应用程序中使用强参数gem

替代:上下文属性

另一种方法,在用户模型上引入一个上下文变量 – *注意我不熟悉attr_accessible的’as’选项*

 class User < ActiveRecord::Base attr_accessor :is_admin_applying_update validate :company_id, :presence => :true, :unless => is_admin_applying_update validate :disabled, :presence => :true, :unless => is_admin_applying_update validate :first_name, :presence => :true, :unless => is_admin_applying_update # etc... 

在管理控制器中,将is_admin_applying_update属性设置为true

 class Admin::UsersController # ... def update @user = User.find(params[:id]) @user.is_admin_applying_update = true @user.update_attributes(params[:user]) 

注意:您还可以对validation进行分组并使用单个条件

哈克方法:

 def update @user = User.find(params[:id]) @user.define_singleton_method :run_validations! do true; end @user.update_attributes(params[:user], :as => :admin) redirect_to edit_admin_user_path(@user), :notice => "User Account Updated" end