Ну, я могу придумать для вас два способа сделать это.Во-первых, в контроллере: предполагается, что у вас есть метод permitted_to?
, который проверяет, разрешено ли пользователю изменять этот атрибут
if params[:post]
params[:post].each_pair do |key, value|
@post.send("#{key.to_s}=", value) if @current_user.permitted_to?(:update_attribute, :post, key.to_sym)
end
@post.save
end
Другой способ, который, вероятно, не самый лучший, так как вы будетеизмените свойства класса, это означает, что он будет влиять на все экземпляры модели.
в любом случае, предполагая, что вы используете attr_accessible
для ограничения атрибутов:
в вашей модели, сделайте это:
accessible_attributes = self.class.inheritable_attributes.delete(:attr_accessible)
А также может быть хорошей идеей восстановить его после.
self.class.inheritable_attributes.delete(:attr_accessible) = accessible_attributes
Это работает так же с attr_protected
и attr_readonly
И для второй части.Я бы предположил, что у вас есть массив для каждого типа пользователя с атрибутами, которые они могут изменить.
Например:
self.class.inheritable_attributes[:attr_accessible] =
Set.new(@current_user.allowed_attributes(:post))
или
self.class.inheritable_attributes[:attr_protected] =
Set.new(@current_user.restricted_attributes(:post))
, гдеallowed_attributes
возвращает массив типа ['parent_id', 'published', 'title']