Ответы пользователя по тегу Ruby on Rails
  • Менять изучаемые технологии?

    @Givandos
    верстка, пыха (прощай, родная), рельсы (вы кто?)
    Писать систему под интернет-магазин - это минимум 50% бекэнда, это сложно (если брать нормальную систему), и, следовательно, для этого плохо подходит один фулстек. Тут желательно одного чистого бекэндщика.
    А значит, чистый бекэндщик нужен уже для таких работ.
    Для реально сложных проектов нужны в обязательном порядке чистые беэндщики независимо от выбранного ЯП. И очень часто в количестве больше одного.
    Ответ написан
    Комментировать
  • Как в Ruby on Rails сделать откаты добавления при неудачном случае у его связанных?

    @Givandos
    верстка, пыха (прощай, родная), рельсы (вы кто?)
    Понимаю, что вопрос был задан давно, и возможно ответ уже найден, но тут он не был озвучен, потому...

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

    def create
      subs = Subscriber.new(...)
      subs.address.new()
      subs.save
    end


    -- UPDATE --
    Ошибся с методом создания наследуемых моделей.
    Корректно это будет так:
    def create
      subs = Subscriber.new(...)
      subs.build_address
      subs.save
    end

    Либо subs.addresses.build, если адресов у подписчика много (связь has_many)
    -- end update --

    В данном случае создается экземпляр модели подписчика, дальше создается эксемпляр адреса, принадлежащего модели подписчика, и потом все это пытается сохраниться (записаться в БД). Если что-то идет не так, то save вернет false, при этом сам позаботиться о транзакциях и ролбеках.
    Ответ написан
    5 комментариев
  • Как отфильтровать массив?

    @Givandos
    верстка, пыха (прощай, родная), рельсы (вы кто?)
    favorite_rooms_ids = cookies[:favorite_room]&.split('/')
    favorite_rooms = Room.where(id: favorite_rooms_ids) if favorite_rooms_ids


    Ну и перестаньте использовать кемелкейс-стиль для именования переменных.
    Почитайте стайл-гайд по руби и рельсам. Кемелкейс используется для именования классов/модулей, но не для переменных.
    И собаку в имени переменной использовать нужно только в случае, если эта переменная будет переменной класса, а не переменной метода (то есть будет использоваться еще где-то за пределами конкретного метода). В вашем случае переменная используется тут же (в этом же методе) и не нужна более негде. Значит и именуйте ее корректно.
    Ответ написан
    Комментировать
  • Как реализовать главную страницу для добавления товаров в корзину с помощью nested attributes?

    @Givandos
    верстка, пыха (прощай, родная), рельсы (вы кто?)
    <%= f.fields_for :products do |products_form| %>
    <% @products.each do |product| %>

    По сути хелпер "fields_for" уже есть метод перебора, так что тут "each" лишний.
    Следовательно строка
    <%= f.hidden_field :product_id, value: product.id %>

    станет попроще:
    <%= products_form.hidden_field :product_id %>

    Вообще я бы рекомендовал что-то типа такого:

    <%= form_for @order, remote: true do |f| %>
        <%= f.fields_for :order_items, @products do |product|
            <%= product.hidden_field :product_id %>
            <%= product.number_field :quantity, value: 1 %>
        <% end %>
    <% end %>

    Только в модели order не забудьте получить атрибуты дочерней модели - accepts_nested_attributes_for :order_items

    В результате в реквесте (кстати, сам реквест должен указывать на контроллер, который будет сохранять модель order) у вас должно быть не просто {"products"=>{"quantity"=>"6", "product_id"=>"2"}}, а что-то типа
    {"order_items_attributes"=>[{"quantity"=>"6", "product_id"=>"2"}, {"quantity"=>"3", "product_id"=>"5"}]}
    Ответ написан