Обновить
34
0

Пользователь

Отправить сообщение

А автора/компанию у таких публикаций не показывают? Не могу найти нигде.

Спасибо! Возможно, стоит попробовать выступить с похожей темой. Статьи в гугле находятся и про form object, и про nested attrs, но получается следует периодически дописывать новые, чтобы держать технологию на слуху.


и пиарят, как могут

Без грязи бы пиарили, вроде "рельсы мертвы", было бы лучше. Кроме этого, многие не понимают, что этот пиар — часть бизнеса, и Ник просто зарабатывает так деньги, трэилбрэйзер — это его продукт. Он пишет статьи и говорит на конференциях, чтобы зарабатывать деньги (продавать больше консультаций), в отличие от других разработчиков, у которых цель — делиться опытом или подобная. Поэтому он может тратить на это больше времени, чем другие Что он и делает.


Как и других сферах, продукт может быть и не очень хорошим, но маркетинг вытаскивает.

У ActiveModel все атрибуты виртуальные (если виртуальные — те, которые не хранятся в базе). Через delegate можно настроить проброс атрибутов из AR.


Nested forms — это fields_for и подобные? Тоже все работает.


С i18n непонятно. Нашел reform-rails, выглядит редко поддерживаемым, с такими вот комитами https://github.com/trailblazer/reform-rails/commit/5bd93ed1ee825f107f248c9c67e6bb81f0c75e00. В самом reform такого функционала нет.

А чем reform лучше active_model?


И про операции не совсем понятно. Я допускаю, что в некоторых ситуациях удобно. При этом для простых экшенов вполне достаточно ActiveRecord, а для тех что по-сложнее можно использовать ActiveModel или PORO. Операции выглядят как декларативный способ написания метода call:


class Song::Create < Trailblazer::Operation
  extend Contract::DSL

  contract do
    property :title
    validates :title, presence: true
  end

  step     Model( Song, :new )
  step     :assign_current_user!
  step     Contract::Build()
  step     Contract::Validate( )
  failure  :log_error!
  step     Contract::Persist(  )
end

# вместо простого:
class Song::Create
  def call(attrs:, user:)
    @model = Song.new(attrs)
    @model.current_user = user
    @model.save!
  rescue => e
    log_error!(e)
    raise
  end
end

При этом наверняка реализован (или нужно реализовывать) свой способ расширения, ведь super/yield так просто не получится использовать.

Комментарий из статьи:


The thing is: dependencies.rb does not pretend to emulate constant resolution algorithms. It cannot because Ruby does not pass key information, so it does not attempt to.

dependencies.rb has to be seen in a positive way: it is a feature that has a contract, if you follow the contract, the feature works.

Ну отключить то можно автолоад, и зла не будет :) Но его отсутствие в приложениях гораздо заметнее, чем в библиотеках, например. По-моему, если понять его тонкости, то он становится очень удобным.


В дополнение к вашему совету.


У меня основное правило — лучше его использовать для top-level констант, а для вложенных добавить require_dependency. Я пользуюсь этим модулем вместо многочисленных require_dependency. Помогает и с STI моделями, когда нужно жадно подгрузить вложенные классы.


Хорошая статья о том, почему автолоад работает именно так.

Я далек от современного жс. Скажите, пожалуйста, почему в этом примере нельзя без Reflect?


const $ = selector =>
  new Proxy(
    document.querySelector(selector)||Element,
    { get: (target, key) => target[key] }
   )
;

// Или даже без Proxy:
const $ = selector => document.querySelector(selector)||Element

Наконец-то появился гем для загрузок, в котором все хорошо и все учтено! Читаю ридми и радуюсь, что больше не придется хачить carrierwave: все что сами допиливали тут можно настроить из коробки. Хотя еще не дочитал до конца даже :)

Тут ограничение самого http же — он понятия ни о каких папках не имеет. И вы должны сами решать, как вы их хотите передавать. Каждый файл лучше грузить по-отдельности. Либо соседним параметром имя директории передавать и сохранять файл в эту директорию. Или же разрешить "/" в filename загружаемого файла и отключить их экранирование/замену в либе. В этом случае только надо самим обязательно от path traversal фильтры делать.

К 9му:


2.3.3 :010 > 1073741824000000000.class
 => Fixnum
2.3.3 :011 > 10737418240000000000.class
 => Bignum

Что-то поменялось в новом руби?

Так зарелизьте его на гитхабе под MIT до использования в проекте. Потом просто используете как внешнюю либу, которая случайно оказалось вашей. Даты все сохраняются же — проект написан позже либы, значит все норм. Единственное, если такие отношения с работодателем, то лучше не комитить в либу в рабочее время. На нее права они не поимеют, но смогут доказать, что вы в рабочее время не работали.

Ага. Ещё sass сделали из less, sinatra из express, rails из sails и rspec из mocha :)

Можете попробовать предложить ему middleman. Live-reload из коробки может его заинтересовать.

Буду рад, если гем поможет вам запустить несколько классных ботов :)

git commit -n проще: ничего даже править не надо, сразу есть возможность. Чтобы такого не было, в любом случае надо линтер на ci сервере запускать. Ведь кто-то мог и не настроить хуки вовсе.

2 минуты гугления capybara websocket: https://github.com/tristandunn/cucumber-websocket-example/blob/master/features/user_create.feature


    Given a user named "Sue" is online # <!!!
    And I go to the homepage
    When I fill in "Name" with "Bob"
    And I submit the new user form
    Then I should be on the users page
    And Sue should see "Bob has entered the room." # <!!!

Про FCM. Мозилла и гугл, реализуют по-отдельности протокол webpush. В хроме он работает на основе fcm, но разработчик ничего не должен подключать — всё предоставляет браузер, а разработчик получает только урл-эндпоинт для отправки сообщений конкретному подписчику.


Про SW.
Когда сам разбирался с sw — проклял всё. Документации мало, половина имеющейся — устарела. Но я считаю, что это просто шаг вперёд, дальше будет лучше. По моему ощущению в мире фронтенда уже некоторое время все делают по принципу: сейчас релизим как есть, а завтра латаем дыры и смотрим, что получилось. Тут так и вышло.

Ок. Положите в lib. Скорее всего, вы захотите require_dependency 'protocols/adder' вместо require 'protocols/adder', чтобы не перезапускать сервер в деве, при каждой правке. Тут опять будет утечка.

Вы что? В какие модели? Я же написал, что пример точно из ридми. Только убрал module Protocols. Положил в app/models просто в целях тестирования. В нее нельзя положить файл? Нужно чтобы не было релоада, и самому перезапускать сервер при правке протокола? Про то что это в деве на рельсах, это я в самом первом комментарии написал.

Так будет понятнее?
2.3.0 (main):0[1] > Dry::BlackTie.protocols.size
=> 0
2.3.0 (main):0[2] > Adder
NameError: uninitialized constant Adder::Protocols
from /Users/max/Workspace/ruby/jam_delivery/app/models/adder.rb:15:in `<module:Adder>'
2.3.0 (main):0[3] > Adder
=> Adder
2.3.0 (main):0[4] > Dry::BlackTie.protocols.size
=> 2
2.3.0 (main):0[5] > reload!
Reloading...
=> true
2.3.0 (main):0[6] > Dry::BlackTie.protocols.size
=> 2
2.3.0 (main):0[7] > Adder
=> Adder
2.3.0 (main):0[8] > Dry::BlackTie.protocols.size
=> 3
2.3.0 (main):0[9] > reload!
Reloading...
=> true
2.3.0 (main):0[10] > Dry::BlackTie.protocols.size
=> 3
2.3.0 (main):0[11] > Adder
=> Adder
2.3.0 (main):0[12] > Dry::BlackTie.protocols.size
=> 4
2.3.0 (main):0[13] > Dry::BlackTie.protocols.keys
=> [
  [0] Adder,
  [1] Adder,
  [2] Adder,
  [3] Adder
]

Adder — пример из ридми, из скоупа Protocols только достал. Кроме .protocols есть еще .implementations.

Информация

В рейтинге
Не участвует
Работает в
Зарегистрирован
Активность