Ответы пользователя по тегу Ruby on Rails
  • Как в devise создать нового пользователя будучи уже авторизованным?

    viktorvsk
    @viktorvsk
    По описанию непонятна ваша проблема.

    Вам нужна отдельная страница (адрес, контроллер), который будет обрабатывать создание юзеров, которое вы реализуете сами, без девайза.

    Просто проведите аналогию - стандартная страничка девайза регистрирует случайных пользователей. У них не должно быть прав создавать пользователя. Если вы хотите создавать нового пользователя от лица пользователя, то вы, скорее, кто-то вроде Админа. И для него должен быть немного другой интерфейс.

    Вкратце, вам нужно выполнить что-то вроде
    User.create(password: 12345678, name: "Name")
    Можете попробовать выполнить ее в консоли, добиться, что б она работала, как вам нужно. А после - уже смотреть, что именно происходит в вашем контроллере
    Ответ написан
    2 комментария
  • Как получить поле соединительной таблицы?

    viktorvsk
    @viktorvsk
    Как раз для таких целей рекомендуется вместо has_and_belongs_to_many использовать has_many through:
    Ответ написан
    1 комментарий
  • Как настроить роутинг?

    viktorvsk
    @viktorvsk
    Принципиально, чтобы услуги были вложены в регион, а не наоборот.

    Ох уж эти сеошники
    По факту, вам нужно просто
    mysite.ru/regions/region_id/servises/all

    Превратить в:
    mysite.ru/moskva/services/all

    Для этого можно использовать
    resources :regions, path: ''
    что бы убрать regions
    Что бы превратить region_id в moskva, смотрите apidock.com/rails/Object/to_param

    На самом деле, оптимально иметь что-то вроде mysite.ru/moskva123 (с учетом что region_id == 123), но ваши сеошники поймут это только когда столкнутся с тем, что нужно переименовать moskva в moscow
    Ответ написан
    Комментировать
  • Понадобилось использовать в форме 2 модели(что лучше использовать reform или nested_atributes) от чего это зависит?

    viktorvsk
    @viktorvsk
    Если логика простая и расширения не предвидятся, то используйте nested_attributes, т.к. они уже есть.
    Если логика сложная, то дальше вопрос - такой сложный кусок должен быть 1-2 в системе? Если да, то создайте папку app/services (app/interactors) и положите туда класс AlbumSaver. И папку app/form_objects с классом AlbumUpdateForm. И вызывайте AlbumSaveForm в AlbumSaver.
    Если у вас множество мест, где нужны очень сложные формы, то к предыдущему подходу добавьте какой-нибудь гем для управления формами
    Ответ написан
    Комментировать
  • Почему не находит стили и скрипты в production?

    viktorvsk
    @viktorvsk
    нужно в nginx (apache) написать, что по location /assets передавать управление и директорию /public
    Ответ написан
    Комментировать
  • Почему пропадает редактор текста в форме?

    viktorvsk
    @viktorvsk
    Проблемы никакой нет. Просто вы, очевидно, не переинициализируете редактор после вставки в DOM этой формы.

    Вероятнее всего, при первом рендере страницы идут такие шаги:
    1. Рендерится страница с обычной формой
    2. В конце (или по событие document->ready) инициализируется редактор и форма становится wysiwig
    3. Все происходит так быстро, что момент перехода формы в wysiwig вы не наблюдаете.

    При подгрузке через AJAX же вы вставляете форму, но кода, инициализирующего редактор - нигде нет.

    Выходы:
    1. Вызывать какое-либо событие при изменение DOM в том месте, где у вас вставляется форма. И тогда можно помещать этот код в assets
    2. Прямо в партиале, приведенном в вопросе добавить инициализацию редактора

    Чаще всего вариант №2 предпочтительнее
    Ответ написан
    3 комментария
  • Как правильно искать информацию для вывода по условию?

    viktorvsk
    @viktorvsk
    Ну разве не очевидно, что у вас там 'true' - строка, а в базе, вероятнее всего - логическая
    Ответ написан
    1 комментарий
  • Быстрое развёртывание backend-а: какую технологию выбрать?

    viktorvsk
    @viktorvsk
    Если занимались рельсами 3.2+ на руби 1.9+ то больших проблем при переходе на 4.2 не почувствуете. В крайнем случае, возможно, не будете использовать какие-то последние фишки\удобства.

    Нода для реляционного CRUD - врядли хороший вариант.

    Если от бекенда ничего сверхъестественного не ждете, как вариант - посмотрите всякий (m)BaaS - parse.com, firebase, databoom ...
    Ответ написан
    2 комментария
  • Ruby on Rails не запускается сервер. В чем проблема?

    viktorvsk
    @viktorvsk
    rbenv rehash
    bundle exec rails s
    rm -rf ./bin && bundle exec rake rails:update:bin

    Вообще, гадать в таком ограниченном количестве информации сложно.
    Прямая ошибка ведет сюда

    Плюс, просто гуглите
    undefined method `configure' for # (NoMethodError)
    Ответ написан
    Комментировать
  • Объясните на пальцах как создать статус для объекта?

    viktorvsk
    @viktorvsk
    1. вручную делаете поля "in progress", 'readyh' ...
    2. гуглите ruby state machine (ASM, Workflow gems)
    Ответ написан
  • Почему не работает - if current_user?

    viktorvsk
    @viktorvsk
    Копипастите ошибку
    undefined method `current_user?'

    И получаете первую ссылку на стэковерфлоу

    Откуда взяться методу current_user? если вы его нигде не определили? Devise создает метод current_user и использовать можете точно так же if current_user

    Неужели нынче проще запостить вопрос на тостер, чем убрать один символ в коде?)

    P.S. чем user_signed_in? не устроил то ?
    Ответ написан
  • Почему выдает ошибку? Как исправить?

    viktorvsk
    @viktorvsk
    Скажите, вы если в Великобританию поедете - будете в правом ряду издить на автомобиле ?
    Если руби под виндовс, то хотя бы Vagrant. Но с десяткой, возможно, еще проблемы у Virtual box
    Ответ написан
    6 комментариев
  • Как изменить влияние роутинга на coffeescript?

    viktorvsk
    @viktorvsk
    Потому что у вас в application.js есть строчка
    //= require_tree
    или же по отдельности
    //= require quizzes
    //= require questions


    Научитесь открывать исходный код страницы и разберитесь, что такое asset pipeline
    Ответ написан
    Комментировать
  • Как сделать такой запрос на activerecord?

    viktorvsk
    @viktorvsk
    Я в свое время так и не нашел ответ на этот вопрос.
    Задача была похожая: интернет-магазин, товары, фильтры товаров. При фильтрации товаров нужно выбирать товар у которого, помимо прочего, есть 2 фильтра И с id=1 И с id=2, например (Когда нужно выбрать, скажем, ноутбук у которого И 8ГБ памяти И 14 дюймов диагональ)

    Был вариант с фасетным поиском с помощью полнотекстовых движков (sphinx, solr, elasticsearch и т.д.), но они бы были оверхедом в той ситуации.

    Сейчас уже долгое время работает вот такой метод:
    def filter(fvalues_ids)
      grouped = Catalog::FilterValue.where(id: fvalues_ids.map(&:to_i)).to_group
      query = []
      grouped.each_value do |fvalues|
        ids = fvalues.map(&:id).join(', ')
        query << %(
          SELECT catalog_products.id
          FROM catalog_products
          INNER JOIN
            catalog_product_filter_values ON catalog_product_filter_values.catalog_product_id = catalog_products.id
          WHERE
            catalog_product_filter_values.catalog_filter_value_id IN (#{ids})
        )
      end
    
      query = query.join("\nINTERSECT\n")
      ids = ActiveRecord::Base.connection.execute(query).map{ |row| row['id'] }
      where(id: ids)
    end


    Так, думаю, все понятно. Разве что метод #to_group - он группирует фильтры (например, 8ГБ оперативки и 4ГБ оперативки нужно сравнивать по ИЛИ, а 8ГБ оперативки и 14 дюймов экран - по И)

    Решение выглядит костыльно, но более элегантного не нашел.
    Ответ написан
  • Почему rails не высвобождает память?

    viktorvsk
    @viktorvsk
    Потому что так работает подавляющее число скриптовых языков.
    Когда нужна память - она берется из ОС. Когда память чистится, она помечается как доступная к перезаписи, но не отдается обратно ОС

    Для такой задачи, как вы описали, следуте использовать фоновые очереди задач: delayed job, resque, sidekiq, rabbitmq...

    Кстати, delayed job и, кажется, sidekiq - тоже не высвободят память. Их нужно будет убивать периодически убивать(например, с помощью monit и лимитом памяти). Resque же создает новый форк на каждую задачу
    Ответ написан
    4 комментария
  • Как задать спрайт after псевдоэлементу?

    viktorvsk
    @viktorvsk
    ТЕГИ О_о
    Ответ написан
    Комментировать
  • Прошу объяснить, как работает self и protected в Ruby?

    viktorvsk
    @viktorvsk
    Public - должны использоваться очень аккуратно. Чем меньше - тем лучше. Это внешнее API для других классов, которые будут его использовать. А чем меньше можно узнать, тем быстрее это можно выучить и запомнить, тем меньше ошибок сделать.

    Protected - это те методы, которые доступны потомкам (классам, что наследуют), но не доступны внешним классам. Грубо говоря, удобно, когда вы знаете, что от класса А будут наследовать много-много разных классов, и у этих классов будет один (или много, не важно) общий метод. Который, однако, совершенно не нужен внешним классам. Если бы не было протектеда, было бы 2 пути - сделать метод, который должен быть у всех потомков - публичным. Это плохо, потому что это лишняя информация для внешних классов. Или же - дублировать одинаковые методы в каждом классе потомке. Это плохо, потому что не DRY.

    Private - это те методы, который доступны только классу. То есть, грубо говоря, пользоваться ими вы можете только в том же файле, где идет определение класса. Например, удобно ими пользоваться для рефакторинга. Представим, что есть публичный метод, который уже много лет используют 100 разных, неизвестных классов. Но в этом методе - 500 строк. Менять метод нельзя, поэтому вы превращаете его в 10 строк-вызовов приватных методов.

    Лучше всего это усвоить, создав разные вариации и попробовав повызывать разные методы. 2 важных вещи, которые нужно помнить в Ruby:
    1) Разные ключевые слова для методов класса и экземпляра (private, private_class_method)
    2) Если тестируете поведение в консоли с использованием #send, то поведение будет не ООП-шное - #send игнорирует видимость методов

    С self все проще. По умолчанию, всегда self подставляется. Метод вызывается сначала для текущего объекта - потом смотрится наличие методов в предке и т.д. и т.д. до объекта Object. Зачем иногда явно пишут self ? Потому что в руби можно создавать методы вида def method=() end; и использовать их с пробелом: method = 2. Для этого, что бы дать понять, что используется именно метод, а не определяется локальная переменная, иногда прибегают к полной записи.

    P.S. Если что-то действительно не понятно даже здесь - берите любую книгу по ООП или википедию и пробуйте все в консоли на любом языке программирования, пока не уловите суть.
    Ответ написан
    4 комментария