Ruby on Rail — создание папки и файла .txt при создании новой записи

#ruby-on-rails #ruby #file #directory

#ruby-on-rails #ruby #файл #каталог

Вопрос:

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

Чего я хочу добиться: когда есть домены created , в моей public/domains папке я хочу создать новую папку с именем папки => domain id и добавить .txt файл с тем же соглашением об именовании.

Пример:

 Public // This is public folder in Rails
  --- domains
        ---- 2 // This is domain ID
             --- 2.txt
  

Что у меня есть сейчас:

 class Domain < ActiveRecord::Base
  def create_folder
    dir = Dir.mkdir("#{Rails.root}/public/domains/#{self.id}")
    file = File.dirname("#{Rails.root}/public/domains/#{self.id}/#{self.id}.txt")
  end
end
  

Это создает папку, но не создает .txt файл.

Комментарии:

1. Почему вы хотите сгенерировать этот файл, public а не отправлять текстовый ответ от контроллера?

2. И в чем проблема? Что вы пробовали? Что сработало не так, как вы ожидали? (Кстати, исходя из вашего вопроса, вы, вероятно, вводите уязвимость в системе безопасности. То, что вы описали, не похоже на хорошую идею.)

3. Я собираюсь использовать эту папку для некоторых целей, которые я собираюсь использовать вне приложения.

4. Причина, по которой я сталкиваюсь с этим, заключается в том, что веб-сайты получают .js файл, в который они включаются <head></head> , и одна из функций, которые у нас есть, — это подсчет просмотров , которые получает файл. Таким образом, вместо того, чтобы добавлять тысячи показов каждую секунду, мы добавляем показы в этот файл и каждые 5 минут добавляем их hits table . В этом идея. есть какой-нибудь другой способ вместо этого?

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

Ответ №1:

File.dirname не создает файл.

Вы хотите:

 filename = Rails.root.join("/public/domains/#{id}/#{id}.txt")

File.open(filename, 'wb') do |file|
  file << "My content"
  file << "More content"
end
  

Обязательно создайте каталог перед

Что касается вашего варианта использования:

Не используйте файл. Не храните его общедоступным. При необходимости используйте Redis или аналогичный. Но сначала просто попробуйте, если ваша БД не справляется с нагрузкой. Или вы пытались достичь предела?

Имейте в виду, что все, что находится в / public, является общедоступным, что означает, что к нему можно получить доступ через ваш веб-сервер.

Пример, не относящийся к Rails:

 require 'fileutils'
id = 123
filename = "/tmp/public/domains/#{id}/#{id}.txt"
FileUtils.mkdir_p(File.dirname(filename))
File.open(filename, 'wb') do |file|
  file << "My content"
  file << "More content"
end
  

Комментарии:

1. Спасибо @pascal. Нет, я не достиг предела, но я боюсь, что если он будет получать тысячи просмотров каждую секунду, это вызовет некоторые проблемы. Не могли бы вы, пожалуйста, рассказать, как Redis это делает?

2. Если вы будете получать тысячи просмотров каждую секунду, тогда у вас хорошая проблема :-). И, возможно, есть другие решения вашего вопроса. Redis (и другие) — это хранилище данных в памяти. Вы можете увеличивать целое число для каждого посещения. Затем каждые X минут / секунд вы можете выпускать одно обновление для своей базы данных и сбрасывать счетчик. Но сначала я бы выбрал простое решение и провел некоторый сравнительный анализ.

3. Да, это идея, лежащая в основе того, что я пытался сделать. Каждое посещение регистрируется в этих файлах и каждую минуту или около того отправляет одну строку в базу данных. Tnx за помощью 🙂

4. Я пробовал с вашим кодом, но файлы все еще не созданы. Я также получил ошибку: undefined local variable filename

5. хорошо, назначьте filename желаемое имя файла в виде строки. Обновленный образец.