2012-12-25 8 views
6

Chcę pominąć sprawdzanie poprawności, gdy próbuję edytować użytkownika jako administrator.Jak pominąć sprawdzanie poprawności jako admin podczas update_attributes?

model

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 

Więc starałem się zmienić update działania w celu

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 

Ale wtedy nie masz dostępu do ustaw :disabled i :company_id atrybuty bo nie wiem gdzie ustawić as: :admin

Odpowiedz

12

Spróbuj: metodę

@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

Silne Parametry

To był problem z szyn do przez długi czas, w Rails 4 wprowadzają "Strong Parameters"

Można użyć silnego parametry klejnot w szynach 3 aplikacje oraz

alternatywna: Kontekst Atrybut

Innym sposobem, aby to zrobić, wprowadzić zmienną kontekstowe na modelu użytkownika - * Uwaga Nie znam opcji "as" dla 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... 

W kontrolerze administratora ustawić is_admin_applying_update atrybut prawdziwego

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

UWAGA: można również grupować walidacji i wykorzystywać jeden warunkowy

+0

jestem nowy na szynach. Czy to jest bezpieczne? Czy ta metoda nie pokona punktu silnych parametrów? Czy też są mocne parametry przede wszystkim do podatności na masowe przypisywanie? –

+0

mocne parametry są przeznaczone dla luk w zakresie nadawania mas, można użyć sprawdzania kontekstu w połączeniu z tym, nigdy nie używałem go do sprawdzania roli, zwykle gdy model jest aktualizowany z wielu formularzy, a walidacja musi się różnić między nimi – house9

Powiązane problemy