2012-12-25 17 views
6

Kullanıcıyı yönetici olarak düzenlemeye çalıştığımda doğrulama işlemini atlamak istiyorum.Güncelleme_görünümleri sırasında doğrulamaları nasıl yönetici olarak atlayabilirim?

Modeli

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

Kontrolör

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 

yüzden

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 

için update eylemi değiştirmeye çalışmış Ama sonra 0 ayarlamak erişiminiz yok

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

cevap

12

bu deneyin ayarlamak için nerede olduğunu bilmek

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 
0

Hack yöntemi:ve :company_id nitelikleri i dont çünkü as: :admin

5

Güçlü Parametreler

Bu için raylar ile ilgili bir sorun olmuştur Uzun bir süre, Raylar 4'te "Güçlü Parametreler"

'u tanıtıyorlar Bağlam Özellik

bunu yapmanın bir başka yolu, bir bağlam değişkeni tanıtmak:

3 uygulamaları yanı

Alternatif raylar güçlü parametreler mücevher kullanabilirsiniz kullanıcı modelinde - * Not attr_accessible *

için 'as' seçeneğiyle aşina değilim Yönetici kontrolörü olarak
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... 

gerçek

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

NOT is_admin_applying_update özelliğini ayarlamak: Ayrıca grup doğrulamaları ve tek koşullu

+0

Ben kullanabilirsiniz raylara yeni. Bu güvenli midir? Bu yöntem güçlü parametreler noktasını bozmaz mı? Ya da öncelikli olarak kitlesel atama zafiyetleri için güçlü parametreler mi? –

+0

güçlü parametreler toplu atama güvenlik açıkları içindir, bağlam geçerliliğini bununla birlikte kullanabilirsiniz, genellikle bir modelin birden çok formdan güncelleştirildiği ve doğrulama gereksinimlerinin aralarında farklılık gösterdiği durumlarda rol denetimi için hiç kullanmadım – house9

İlgili konular