2012-12-25 29 views
6

我想跳过验证,当我试图编辑用户作为管理员。如何在update_attributes期间以管理员身份跳过验证?

型号

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 

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

回答

12

试试这个:

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

哈克方法:

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 
5

强参数

这一直是一个问题,有轨的很长一段时间,在Rails 4中他们推出了“Strong Parameters”

您可以使用强大的参数宝石在轨道3级的应用以及

备选:上下文属性

另一种方式来做到这一点,引入上下文变量在用户模型上 - *注意我不熟悉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]) 

注意:您也可以组验证和使用一个单一的条件

+0

我新的铁路。这是安全的吗?这种方法是否不能击败强参数?还是主要用于大规模分配漏洞的强参数? –

+0

强大的参数是用于批量分配的漏洞,你可以结合使用上下文验证,我从来没有真正将它用于角色检查,通常当一个模型从多个表单中更新并且验证需要在它们之间有所不同时 – house9