Автоматическая установка ответственного за смену консоли в paper_trail в Heroku

paper_trail отлично работает для нас. Но когда мы входим в консоль Heroku с помощью heroku run console, а затем вносим изменения, автор изменения не устанавливается :(. Таким образом, paper_trail имеет для этого механизм:

In a console session you can manually set who is responsible like this:

>> PaperTrail.whodunnit = 'Andy Stewart'
>> widget.update_attributes :name => 'Wibble'
>> widget.versions.last.whodunnit              # Andy Stewart

You can avoid having to do this manually by setting your initializer to pick up the username of the current user from the OS, like this:
<bunch of code>

Мой вопрос в том, как мы можем автоматизировать это с помощью Heroku? Может быть, я могу сделать что-то подобное?

heroku run console -e "PaperTrail.whodunnit = '123:console'"

Затем каждый из нас может просто создать файл console.sh с указанным выше, используя наши индивидуальные идентификаторы пользователей. Или есть другой механизм для автоматизации этого?


person at.    schedule 06.04.2015    source источник
comment
Вы можете проверить, работает ли код в консоли (stackoverflow.com/questions/13506690/) ; если да, то загрузите определенный файл .rb (например, в config/whodunnit.rb), который будет запрашивать имя пользователя перед загрузкой остальных (спасибо классу STDIN)   -  person MrYoshiji    schedule 06.04.2015


Ответы (2)


Вы можете избежать необходимости делать это вручную, настроив свой инициализатор для получения имени пользователя текущего пользователя из ОС.

Это в основном ответ. Поместите код PaperTrail.whodunnit в инициализатор в config/initializers. Они запускаются при запуске консоли. Это было бы лучшим местом, поскольку оно вступит в силу, когда любой из разработчиков войдет в консоль heroku без необходимости изменять команду, которую они запускают для этого:

# config/initializers/default_whodunnit.rb
if defined?(Rails::Console)
  PaperTrail.whodunnit = "whatever"
end

Обновление:

Heroku — это сервер git, как и Github, но вы нажимаете на heroku, чтобы инициировать развертывание. Ответ MrYoshiji предоставляет возможность дать вашим разработчикам возможность указать свои имена пользователей и установить их в качестве детектива. Просто сделайте образец кода его ответа из содержимого вашего инициализатора default_whodunnit.rb. Таким образом, вы зарегистрируете файл whodunnit, отправите его в Heroku, и теперь каждый раз, когда разработчик входит в консоль heroku, у него спросят имя пользователя, и это установит whodunnit.

person DiegoSalazar    schedule 06.04.2015
comment
Это жестко закодированное значение, противоположное тому, что хочет OP: он хочет иметь возможность просто спросить, кто запускает консоль, чтобы установить whodunnit PaperTrail, а не всегда использовать один и тот же идентификатор. - person MrYoshiji; 06.04.2015
comment
Как вы знаете, туда можно поместить что угодно. Не обязательно должно быть жестко заданным значением. - person DiegoSalazar; 07.04.2015
comment
Этот способ звучит идеально! У каждого разработчика просто будет свой собственный файл default_whodunnit.rb, который не зарегистрирован в github... - person at.; 08.04.2015
comment
Нет, это не так. Файл default_whodunnit.rb должен быть возвращен в git, потому что он должен присутствовать в репозитории Heroku, чтобы он мог работать, когда вы heroku run rails c. Обновленный ответ с дополнительной информацией. - person DiegoSalazar; 08.04.2015
comment
ааа, это правда @diego.greyrobot. хм.. Могу ли я передать что-нибудь в консоль, когда я вызываю heroku run console. Если бы я мог передать переменную среды или что-то в этом роде, я мог бы прочитать ее в default_whodunnit.rb, и разработчикам просто нужно было бы использовать очень простой скрипт, чтобы перейти в консоль heroku, который передал бы их идентификатор. - person at.; 09.04.2015
comment
Честно говоря, вероятно, самый простой способ убедиться, что каждый всегда указывает свое имя пользователя, — это спрашивать его каждый раз, когда они входят в систему. Просто используйте STDIN.gets, как описано в ответе MrYoshiji ниже. - person DiegoSalazar; 09.04.2015
comment
Я проверил, и инициализаторы не вызываются при запуске консоли. Только при запуске сервера. - person at.; 16.04.2015

Вы можете сделать это в своем файле application.rb:

if Rails.const_defined? 'Console'
  STDOUT.print "Enter your name for PaperTrail.whodunnit : "
  username = STDIN.gets.split("\n").first
  puts "Hello #{username}!"
  PaperTrail.whodunnit = username
end

Только когда вы запустите консоль, пользователю будет предложено ввести имя пользователя, которое будет использоваться в качестве автора изменений.

person MrYoshiji    schedule 06.04.2015
comment
Это здорово, я не знал, что вы можете сделать это при запуске консоли. Хотя путь @diego.greyrobot еще проще. - person at.; 08.04.2015
comment
Где вы поместите это именно в файле application.rb? Я не могу запустить это при запуске консоли. Кажется, ничего в application.rb не вызывается при запуске консоли. - person at.; 16.04.2015
comment
@в. Если я использую его в самом конце своего application.rb, при запуске сервера меня просят ввести имя ТОЛЬКО при открытии консоли. В конце концов спровоцируйте ошибку внутри файла application.rb, чтобы убедиться, что Ruby его читает (делите целое число на ноль, попробуйте добавить массив к хэшу, все, что на самом деле вызовет ошибку). - person MrYoshiji; 16.04.2015