2012-12-25 33 views
6

Tôi muốn bỏ qua xác thực khi tôi đang cố chỉnh sửa người dùng là quản trị viên.Làm cách nào để bỏ qua xác thực là quản trị viên trong update_attributes?

Mẫu

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

khiển

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 

Vì vậy, tôi đã cố gắng để thay đổi update hành động để

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 

Nhưng sau đó tôi không có quyền truy cập vào thiết lập :disabled:company_id thuộc tính, vì tôi không biết được nơi để thiết lập as: :admin

Trả lời

12

Hãy thử điều này: Phương pháp

@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

thông số mạnh

Đây là một vấn đề với đường ray cho một thời gian dài, trong Rails 4 họ đang giới thiệu "Tham số mạnh"

Bạn có thể sử dụng các thông số mạnh mẽ đá quý trong đường ray 3 ứng dụng cũng

Alternative: Bối cảnh Thuộc tính

Một cách khác để làm điều đó, giới thiệu một biến bối cảnh trên mô hình người dùng - * Lưu ý Tôi không quen với tùy chọn 'as' cho 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... 

Trong điều khiển quản trị của bạn thiết lập các thuộc tính 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]) 

Chú ý: bạn cũng có thể nhóm kiểm chứng thực và sử dụng một điều kiện đơn

+0

Tôi mới cho đường ray. Việc này có an toàn không? Liệu phương pháp này không đánh bại điểm của các thông số mạnh? Hoặc là các thông số mạnh chủ yếu cho các lỗ hổng được giao hàng loạt? –

+0

các tham số mạnh mẽ dành cho lỗ hổng phân khối, bạn có thể sử dụng xác thực ngữ cảnh kết hợp với điều đó, tôi chưa bao giờ sử dụng nó để kiểm tra vai trò, thường là khi một mô hình được cập nhật từ nhiều biểu mẫu và xác thực cần phải khác nhau giữa chúng – house9

Các vấn đề liên quan