Страницы

Поиск по вопросам

Показаны сообщения с ярлыком gems. Показать все сообщения
Показаны сообщения с ярлыком gems. Показать все сообщения

воскресенье, 12 января 2020 г.

Менеджмент front-end зависимостей на Ruby

#ruby #gems #dependencies


Здравствуйте. Пишу программу с выводом в браузер. Для нее (помимо rubygems) нужно
несколько зависимостей: CSS, шрифты, JavaScript библиотека. Надо организовать управление
зависимостей, в первую очередь хотя бы скачивание по команде.
Варианты, которые я придумал:


Это может организовать Bower, но, так как программа распространяемая, не хотелось
бы заставлять пользователей устанавливать помимо Ruby еще и Node.js только чтобы загрузить
зависимости.
Можно распространять прямо с программой, но программа будет в Open Source на GitHub,
а засовывать чужие проекты в свой репозиторий, пусть даже и с дисклеймером, как-то
неудобно. Плюс самому придется следить за версиями каждой библиотеки и делать отдельный
commit под каждую версию каждой зависимости.
Можно сделать это через Rake + GitHub + Net::HTTP + File.write, но это как-то ненадежно
и займет дополнительную кучу кода, который надо поддерживать
Gem обертки, как известно, почти никогда никем не обновляются


Есть еще пара идей, но они на данный момент не кажутся реализуемыми:


Bower, увы, не предоставляет публичного Web API
CDN не вариант, так как программа, опять же, распространяемая и должна работать и
без подключения к интернету
Gem под данную задачу не нашел (подробнее ниже)


Пробовал также искать gem, но результаты плачевны:


giternal и rip позволяли загружать зависимости c git репозиториев, но они давно никем
не поддерживаются и не проходят большинство тестов
rails-assets и torba только для sprockets, а мне не хочется переписывать весь проект
под гем, который, слишком мягко говоря, мне совершенно не нравится.

    


Ответы

Ответ 1



В фронтэнде Node.js крепко укоренился для сборки и преобразования всего и вся. Поэтому требовать установленный Node.js для модификации ассетов это дело нынче вполне обычное. Посему, для полной среды разработки под ваш проект Node.js всё равно понадобится. Бежать от него бесполезно — догонит. Для вас в основном стоит задача "не заставлять конечных пользователей ставить Node.js, т. к. во время выполнения он уже не нужен". Но конечные пользователи скорее возьмут готовую сборку, чем будут делать её сами, и если в готовых сборках ассеты уже собраны, то и Node.js им не понадобится. Следовательно, задача уже решена. git clone не предназначен для распространения сборок. Вот совсем. Если вас нервирует необходимость заставлять даже ради разработки исключительно серверной части ставить зависимости ассетов, то можно сделать ход конём и вынести их в отдельный гем. А при генерации конфигов для вебсервера (или настройке встроенного) можно узнать, куда гем с ассетами установлен (на примере activesupport): # они работают немножко по-разному, вас интересует скорее первое Bundler.rubygems.find_name('activesupport').first.full_gem_path Gem::Specification.find_by_name('activesupport').gem_dir Это может иметь смысл где ассеты и серверная часть очень слабо связаны друг с дружкой, если ассеты образуют что-то SPA-подобное, например. И, соответственно, работает прежнее решение: вы пакуете релизы ассетов заранее, а кому надо заняться разработкой, по желанию может поставить уже упакованные.

вторник, 16 июля 2019 г.

Как использовать гем rails-settings-cached?

Всем привет. Кто-нибудь пользовался гемом rails-settings-cached (https://github.com/huacnlee/rails-se...er/README.md)?
У меня по этому поводу следующие вопросы и проблемы. (все вопросы основываются на гайде по гему, ссылка выше)
У меня Rails v.4.2.1. какую версию гема мне нужно использовать "rails-settings-cached", "0.4.1" для Rails 4.1.x или "rails-settings-cached", "0.3.1" для Rails 4+ ?? После установки гема генерируем settings:
$ rails g settings SettingsCompany
это создаст только модель settings_company.rb и миграцию для создания таблицы БД. Т.е. чтобы сделать вьюхи для редактирования настроек админом приложения, контроллер нужно вручную создать?
Опуская Вопрос 2, допустим я создаю контроллер для Settings. То, как я его назову, будет иметь значение?
Итак
rails g controller Settings
имеем (исходя из гайда):
class SettingsController < ApplicationController
def index # to get all items for render list @settings = Setting.all end
def edit @setting = Setting.unscoped.find(params[:id]) end end
и при попытке перейти по settings/index.erb получается ошибка
NameError in SettingsController#index uninitialized constant SettingsController::Setting
в строке
@settings = Setting.unscoped
и что такое и почему "unscoped"?
И я не совсем понимаю принцип работы гема
чтобы занести данные в БД никакие манипуляции с миграциями не нужны? и достаточно просто написать в коде что-то типа такого?:
Setting.admin_password = 'supersecret'
и это создаст в таблице запись со значениями
var = admin_password value = supersecret
??
спасибо


Ответ

1 "0.4.1" для Rails 4.1.x
2 Да, контроллер и вьюхи самостоятельно.
3 Должно быть так:
class SettingsController < ApplicationController
def index # to get all items for render list @settings = SettingsCompany.get_all end end
unscoped отменяет все scope. Скоупы это предопределенные фильтры для класса:
class Shirt < ActiveRecord::Base scope :red, -> { where(color: 'red') } end
Таким образом, можно вызвать Shirt.red и получить коллекцию красных рубашек. В гайде unscoped используется для отмены каких-то внутренних скоупов, которые наложены в самом геме.
4 Да, достаточно
Setting.admin_password = 'supersecret'
эта магия работает через method_missing

среда, 10 июля 2019 г.

Почему gem turbolinks так странно себя ведет?

В документации по этому gem'у сказано, что он необходим для того, чтобы получать новую страницу с сервера через ajax, парсить ее на стороне клиента и заменять только содержимое тега body и head.
Стандартное "одностраничное" приложение, получающее страницы с сервера через ajax я всегда проверял следующим, как мне кажется, надежным методом: вставлял на одну страницу тег (в случае rails это audio_tag) и ссылку на другую страницу. Если при переходе на другую страницу по этой ссылке музыка, начавшая проигрываться на предыдущей странице, продолжила играть, значит действительно ajax работает как надо и страница не делает свой обычный цикл перезагрузки, а парсится прямо в клиенте из html, полученного с сервера.
Но в gem turbolinks, по-умолчанию установленный в rails приложение, я смотрю, все не так.
Я неправильно понимаю суть его работы? И что-то не так делаю?


Ответ

Turbolinks аяксово получает html-ответ от сервера и заменяет весь body. Информация внутри head не заменяется. Также есть возможность пометить какой-либо тег в body как перманентный, и он заменяться не будет. В пятой версии turbolinks это помечается через атрибут data-turbolinks-permanent

как забрать данные с определенного web сайта gem Mechanize

Есть сайт https://customer.menziesworld.nl/, с него нужно забрать данные по определенной накладной.
пытаюсь в консоли сделать следующее:
require 'mechanize' agent = Mechanize.new agent.get('https://customer.menziesworld.nl/') form = agent.page.forms.first form['ctl00$cpMasterBody$tbAwbPrefix'] = 262 form['ctl00$cpMasterBody$tbAwbSerial'] = 50426471 form.submit
agent.page.search('.dxgvTable')
но в ответ получаю #=> []
Подскажите пожалуйста, как решить проблему, сайт на ASP.NET
Так же подойдет решение с эмуляцией браузера, типа Катибара Полтергейст


Ответ

Получилось как-то так:
require 'mechanize' AwbPrefix = 262 AwbSerial = 50426471
agent = Mechanize.new agent.user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'
agent.get('https://customer.menziesworld.nl')
form = agent.page.forms[0]
headers = { 'Host' => 'customer.menziesworld.nl', 'Connection' => 'keep-alive', 'Cache-Control' => 'max-age=0', 'Origin' => 'https://customer.menziesworld.nl', 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Content-Type' => 'application/x-www-form-urlencoded', 'Referer' => 'https://customer.menziesworld.nl', 'Accept-Encoding' => 'gzip, deflate, br', 'Accept-Language' => 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4' }
params = { '__EVENTTARGET' => '', '__EVENTARGUMENT' => '', '__VIEWSTATE' => form.field_with(name: '__VIEWSTATE').value, '__VIEWSTATEGENERATOR' => form.field_with(name: '__VIEWSTATEGENERATOR').value, 'ctl00$cpMasterBody$tbAwbPrefix' => AwbPrefix, 'ctl00$cpMasterBody$tbAwbSerial' => AwbSerial, 'ctl00$cpMasterBody$btSearch' => 'submit' }
agent.post('https://customer.menziesworld.nl', params, headers)
agent.page.search('.dxgvTable')
Поправьте пожалуйста если что-то можно улучшить.

понедельник, 17 июня 2019 г.

проблема с “Rails bootstrap 4 gem”

$ rails -v Rails 5.0.0.1 $ ruby -v ruby 2.3.0p0
Устанавливал bootstrap gem по инструкции В итоге мой "aplication.scss":
@import "bootstrap-sprockets"; @import "bootstrap";
Мой "aplication.js":
//= require jquery //= require jquery_ujs //= require bootstrap //= require turbolinks //= require_tree .
В логах сервера пусто.
Создал "layout":

Starter Template for Bootstrap




Bootstrap starter template

Use this document as a way to quickly start any new project.
All you get is this text and a mostly barebones HTML document.



<%= yield %>

Создал пустой контроллер и проверил - вот что в итоге:
В браузере никакого намека на подключение "bootstrap". Код ровно такой, какой я указал в "layout". Может кто знает, в чем проблема? Не хочу в "assets" кидать файлы "bootstrap"'а ручками, "гем" же зачем-то придумали?


Ответ

Не вижу у вас в лайауте подключения стилей:
<%= stylesheet_link_tag 'application', media: 'all' %>
Добавьте это в head

И вместо этой секции:

Подключите ваш application.js
<%= javascript_include_tag'application' %>
А js-библиотеки (jquery, tether, и другие) подключайте в нем через //= require. jquery у вас уже подключена, а tether можно подключить, например, через rails-assets.org
# Gemfile gem 'rails-assets-tether', source: 'https://rails-assets.org'
# application.js //= require tether
# application.css *= require tether