Tôi có một ứng dụng đường ray với một mô hình người dùng, có khả năng có nhiều vai trò. Tôi thực hiện điều này bằng cách sử dụng bitmask như thế này:Cho phép chỉ có một số giá trị có thể trong Rails thông số mạnh
class User < ActiveRecord::Base
DEFAULT_ROLES = %w[developer entrepreneur]
ROLES = ['admin', 'entrepreneur', 'developer']
def has_role?(role)
roles.include?(role.to_s)
end
def is?(role)
has_role?(role)
end
def roles=(roles)
self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
end
def roles
ROLES.reject do |r|
((roles_mask.to_i || 0) & 2**ROLES.index(r)).zero?
end
end
end
Trong trang đăng ký cho các ứng dụng, tôi muốn người dùng lựa chọn nếu họ là một 'doanh nhân' hoặc 'phát triển'. Tuy nhiên, tôi muốn đảm bảo rằng họ không thể tự gán cho mình (hoặc bất kỳ ai khác) bất kỳ vai trò nào khác, trừ khi họ đã là quản trị viên.
Suy nghĩ đầu tiên của tôi là để làm điều này trong phương pháp roles=
bởi changin nó trông giống như
def roles=(roles)
unless current_user.is?(:admin)
validates_inclusion_of roles, :in => DEFAULT_ROLES
end
self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
end
Tuy nhiên, khi tôi phát hiện ra, bạn không thể truy cập current_user
từ bên trong một mô hình (mà tôi đoán làm cho nếu bạn nghĩ về nó ...)
Nỗ lực tiếp theo của tôi là xem tôi có thể làm điều này bằng cách sử dụng Strong Parameters hay không.
tôi đã mong đợi nó sẽ giống như thế này (tôi đang sử dụng đưa ra, trọng các RegistrationsController)
class RegistrationsController < Devise::RegistrationsController
private
def sign_up_params
if (user_signed_in?) && (current_user.is?(:admin))
params.require(:user).permit(:name, :school, :email, :password, :password_confirmation, {roles: User::ROLES})
else
params.require(:user).permit(:name, :school, :email, :password, :password_confirmation, {roles: User::DEFAULT_ROLES})
end
end
def account_update_params
if (user_signed_in?) && (current_user.is?(:admin))
params.require(:user).permit(:name, :school, :email, :password, :password_confirmation, :current_password, :about_me, {roles: User::ROLES})
else
params.require(:user).permit(:name, :school, :email, :password, :password_confirmation, :current_password)
end
end
end
Tuy nhiên, khi tôi đã cố gắng đó, tôi nhận điều này: mà làm cho tôi nghĩ rằng tôi m hiểu lầm các tham số mạnh mẽ thực sự hoạt động như thế nào.
Có thể hạn chế những giá trị người dùng có thể nhập cho bất kỳ lĩnh vực nhất định trên cơ sở đó vai trò người dùng với thông số mạnh mẽ? Nếu không, có cách nào khác để thực hiện việc này không?
Nó phải được xác định là xác thực mô hình. Tham số mạnh là để lọc các khóa param, không phải các giá trị. – kengo
@kengo - Làm cách nào để xác thực trong mô hình nếu tôi không thể truy cập vai trò người dùng hiện tại? (vì quản trị viên có thể đang sửa đổi người dùng khác, không chỉ là bản thân họ) – Ephraim
Bạn không thể xác định tham số mạnh mẽ như before_action. Sử dụng như thế này trong phương thức tạo hoặc cập nhật. Account.new (account_update_params) – kengo