Подпишитесь на рассылку о самых интересных материалах в мире веб-разработки :)

Использование ActiveAdmin. Как обойти валидацию?


#1

Приветствую!
В нашем проекте мы используем для админки ActiveAdmin. Необходимо разрешить админам исправлять даты, которые изменять после создания записи по условиям модели (валидации) запрещено. Как обойти этот запрет, и разрешить админам править эти даты? В модели проверять статус юзера нельзя. Может можно обойти валидации в ActiveAdmin? Заранее прошу прошение если вопрос дилетантский - я познакомился с руби недавно.


(Kvokka) #2

зато, поиск телепата идет полным ходом. какая версия руби, рельсы (видимо) и актив админа не указано, как и не ясно откуда взялась эта странная авторизация, где запрещено передавать пользователя в модель. никто не запрещает использовать хранилища perrequest или perthread или вообще запилить текущего пользователя в кеш и брать оттуда. или вообще выпилить всю авторизацию в отдельный модуль и проверять все там. или обколоться идея треилблейщера и тогда вообще все станет боком. при том, странно, что если в модели есть проверка прав пользователя, от чего там не хранится автор (да и как его тогда хранить, если авторта нет)

в общем сплошные загадки


#3

Я наверно и вправду путаюсь в показаниях - сейчас попробую рассказать яснее. Сначала о версиях: ruby 2.2.3, Rails 4.2.7.1, ActiveAdmin 1.0.0.pre4. Есть модель “Event” с полями “start_date” и “end_date” и валадацией, которая запрещает пользователям изменять даты, если “start_date” уже в прошлом. Мне необходимо сделать так, чтобы эта валидация не распространялась на админов, и они могли править эти даты в ActiveAdmin.


(Kvokka) #4

ну всегда можно приделать тернарную припиську к валидации, типа validates :foo, if: -> { User.current.admin } при этом придется, тогда передать пользователя модели. ну или основываться на авторстве этого Event (если оно сохраняется), ну или хранить текущего пользователя в кеше, для чего CacheRequest в помощь (как-то так гем звался).


#5

В этом и вопрос, как передать пользователя в модель, чтобы проверять админ он или нет.


(Kvokka) #6
class ApplicationController < ActionController::Base
  before_action -> { Rails.cache.write "controller/curent_user/#{Process.pid}", User.current.id, expire_at: 1.hour }
end
class  ApplicationRecord < ActiveRecoed::Base 
  def self.current_user
    id = Rails.cache.read "controller/curent_user/#{Process.pid}"
    id && ::User.find id
  end
end

ну и как итог в любой модели будет доступен пользователь. Не берусь утверждать, что это лучший код или решение в принципе, но не вижу тут чего-то страшного. можно и без кеша тут, но про многопоточность думать придется в любом случае