2012-12-25 13 views
6

Voglio saltare la convalida quando sto cercando di modificare l'utente come amministratore.Come saltare le convalide come admin durante update_attributes?

Modello

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

controller

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 

così ho provato a cambiare update azione per

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 

Ma poi non ho accesso a impostare :disabled e :company_id attributi perché non so dove per impostare as: :admin

risposta

12

Prova questa: metodo di

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

Hack:

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

Parametri forti

Questo è stato un problema con rotaie per da molto tempo, in Rails 4 stanno introducendo "Strong Parameters"

È possibile utilizzare forte parametri gioiello in Rails 3 applicazioni così

Alternativa: Contesto attributo

Un altro modo per farlo, introdurre una variabile di contesto sul modello utente - * Nota Non ho familiarità con l'opzione 'as' per attr_accessible *

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... 

nel controller di amministrazione impostare l'attributo 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]) 

NOTA: è anche possibile raggruppare le convalide e utilizzare un unico condizionale

+0

Sono nuovo alle rotaie. È sicuro farlo? Questo metodo non sconfigge il punto di forti parametri? O sono forti i parametri in primo luogo per le vulnerabilità di massa di assegnazione? –

+0

parametri di forza sono alla ricerca di vulnerabilità di massa di assegnazione, è possibile utilizzare la convalida contesto in combinazione con questo, non ho mai effettivamente utilizzato per il controllo di ruolo, di solito quando un modello viene aggiornato in dalle molteplici forme e la convalida bisogno di differire tra loro – house9

Problemi correlati