2015-06-11 14 views
7

Tôi vừa được làm một chút về đọc trên attr_accessor, attr_accessible và mạnh mẽ thông số tại một vài địa điểm khác nhau:Sự khác nhau giữa attr_accessible và các thông số mạnh mẽ

Difference between attr_accessor and attr_accessible
How is attr_accessible used in Rails 4? http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

Và tôi đang xem xét giao hàng loạt:

http://code.tutsplus.com/tutorials/mass-assignment-rails-and-you--net-31695

Tôi không thể thu hút sự khác biệt giữa các thông số attr_accessible và thông số mạnh. Tôi không tự tin 100% trong sự hiểu biết của tôi về các chủ đề được đề cập ở trên vì vậy tôi có thể thiếu một cái gì đó đơn giản nhưng tôi biết họ làm một công việc tương tự.

Tuy nhiên, sự khác biệt giữa attr_accessible và thông số mạnh là gì? Họ chỉ là một cái tên khác cho cùng một thứ? Tại sao chúng ta di chuyển từ người này sang người khác?

Mọi thông tin đều được đánh giá cao.

Trả lời

14

attr_accessible đã không được chấp nhận trong Rails 4 có lợi cho Thông số mạnh.

Cả hai đều là các cách tiếp cận khác nhau đối với vấn đề gán hàng loạt nhưng thông số mạnh là linh hoạt hơn. Ví dụ, bạn có một mô hình User với các thuộc tính email:stringis_admin:boolean. Bạn muốn cho phép người dùng sửa đổi email của họ thông qua biểu mẫu chứ không phải trường is_admin.

Trong Rails 3 bạn nên làm:

attr_accesible :email 

Với phương pháp này nó không phải là có thể cho một người sử dụng để sửa đổi is_admin vì thuộc tính được bảo vệ.

Một trong những điều tốt đẹp của thông số mạnh là bạn có thể làm như sau trong điều khiển của bạn:

def user_params 
    if current_user.admin? 
    params.require(:user).permit(:email, :is_admin) 
    else 
    params.require(:user).permit(:email) 
    end 
end 

Bằng cách này một người sử dụng quản trị viên sẽ có thể sửa đổi is_admin trong khi một người dùng bình thường sẽ không.

Đây chỉ là một ví dụ và không phải là cách tốt nhất để cấp quyền quản trị cho người dùng nhưng nó khá minh họa.

Ưu điểm chính của Tham số mạnh là chúng được xác định trong bộ điều khiển và có thể được gán động trong thời gian chạy. attr_accessible là một cách tĩnh và nguyên khối hơn cho các thuộc tính danh sách trắng. Mặt khác, attr_accessor là điều hoàn toàn khác và vẫn có thể được sử dụng trong Rails 4, ví dụ, nếu bạn cần một thuộc tính trong mô hình của bạn thì không cần thiết phải tồn tại hoặc được ghi vào cơ sở dữ liệu nhưng bạn cần nó Dưới một hình thức. Hãy suy nghĩ về:

attr_accessor :has_accepted_legal_terms

Đó là một phương pháp của Ruby có thể được sử dụng để khai báo một thuộc tính của mô hình của bạn mà không liên quan đến cơ sở dữ liệu, một thuộc tính của một lớp hoặc Poro (plain old đối tượng ruby).

5

Thông số mạnh và attr_accessible là hai cách khác nhau để thêm bảo vệ an ninh vào tính năng "chuyển nhượng hàng loạt" Rails. Tham số mạnh là cách được quy định bởi phiên bản hiện tại của Rails.

"Chuyển nhượng hàng loạt" là viết tắt thuận tiện trong Rails cho phép bạn đặt nhiều thuộc tính của mô hình trong một câu lệnh.

Ví dụ: hãy tưởng tượng bạn có một số @user mà bạn muốn cập nhật với dữ liệu từ gửi biểu mẫu. Không có bài tập hàng loạt, bạn phải viết mã tẻ nhạt như thế này:

@user.first_name = params[:user][:first_name] 
@user.last_name = params[:user][:last_name] 
@user.phone_number = params[:user][:phone_number] 
... 
@user.save 

Và bật và bật cho mọi trường biểu mẫu.

Với nhiệm vụ đại chúng, tất cả các mã đó trở thành một dòng duy nhất:

@user.update(params[:user]) 

Nhưng, đây là đầy đủ các lỗ hổng bảo mật.params chứa bất kỳ dữ liệu nào được trình duyệt gửi, một người dùng độc hại có thể thêm dữ liệu vào nội dung gửi mà bạn không mong đợi. Ví dụ: họ có thể thêm is_admin=1 vào tham số. Nếu bạn có cột cơ sở dữ liệu is_admin thì việc chuyển nhượng hàng loạt chỉ cho phép người dùng nâng cấp lên quản trị viên. Yikes!

Đây là nơi tham số mạnh mẽ đi kèm. Với thông số mạnh, đường ray sẽ tăng ActiveModel::ForbiddenAttributesError nếu bạn cố gắng làm điều ngây thơ update(params[:user]). Thay vào đó, bạn cần phải rõ ràng về những thông số bạn mong đợi từ việc gửi trình duyệt, sử dụng các trình trợ giúp requirepermit mà Thông số mạnh cung cấp. Như thế này:

def user_params 
    # Note that :is_admin is not permitted! 
    params.require(:user).permit(:first_name, :last_name, :phone_number) 
end 

... 
@user.update(user_params) 

Tôi không thể nói cho người duy trì Rails, nhưng tôi thích thông số mạnh vì nó linh hoạt. Nếu tôi có nhiều hành động trong bộ điều khiển người dùng mong đợi các tham số khác nhau, tôi có thể dễ dàng mô tả bằng cách sử dụng các thông số cần được cho phép sử dụng permit.

Hoặc nếu tôi có vai trò người dùng khác nhau được phép cập nhật các thuộc tính khác nhau, thì tôi có thể dễ dàng mô hình các quyền đó. Như @ CV-Gate đã đề cập, bạn thậm chí có thể thay đổi các quyền này trong thời gian chạy, đây là một quyền lực mạnh mẽ.

Tóm lại, tính linh hoạt của Thông số mạnh là do bạn có thể xác định phương thức user_params ở bất kỳ đâu và theo ý bạn muốn. Bạn có toàn bộ sức mạnh của các khái niệm Ruby và OO để làm cho nó hoạt động theo cách bạn muốn.

Còn khoảng attr_accessible thì sao?

Mà không đi sâu vào chi tiết quá nhiều (vì tính năng này không còn được hỗ trợ bởi Rails): thay vì sử dụng các phương pháp permit, bạn sẽ làm điều gì đó tương tự như sử dụng một vĩ mô attr_accessible trong mô hình riêng của mình, như thế này:

class User < ActiveRecord::Base 
    attr_accessible :first_name, :last_name, :phone_number 
    ... 
end 

Vì vậy, đối với các trường hợp đơn giản, nó hoạt động rất giống với Thông số mạnh; bạn chỉ cần xác định danh sách các thuộc tính ở một vị trí khác.

Tuy nhiên, vì attr_accessible được kết hợp chặt chẽ với định nghĩa của lớp mô hình, bạn mất rất nhiều tính linh hoạt.Điều gì sẽ xảy ra nếu bạn có hai hành động điều khiển khác nhau cần thực hiện phép gán khối lượng cho cùng một mô hình User? Bây giờ bạn đang mắc kẹt.

attr_accessor

Các attr_accessor vĩ mô được xây dựng vào Ruby và không có gì để làm với Rails, chuyển nhượng hàng loạt, hoặc an ninh. Nó chỉ xảy ra để có một tên tương tự. :)

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