2009-12-07 2 views
2

У меня есть несколько приложений (приложение администратора, приложение «public»/non-admin и приложение веб-службы), которые используют общую базу данных.Совместное использование загруженных файлов между несколькими приложениями Rails

У меня есть приложения для совместного использования моделей и другого кода, если это необходимо, поэтому у меня нет нескольких копий одного и того же кода. Однако одной задачей, которую мне еще предстоит настроить, является совместное использование файлов, загружаемых между приложениями. Я использую Paperclip для успешной загрузки файлов в мои приложения, но если он загружает файлы в приложение, выполняющее загрузку.

В идеале, я хотел бы иметь возможность обслуживать все файлы из веб-службы. Моя идея состояла в том, что мне понадобится какая-то задача, выполняемая каждый раз, когда новый файл загружается в любое из приложений, чтобы файл был создан в файловой структуре веб-службы.

Я знаю, что я мог бы легко выполнить обслуживающие файлы из одного приложения, если я загрузил файлы в базу данных (это то, как я это сделал в подобном наборе приложений), но я не уверен, что это лучший путь к пойдите для управления/обслуживания файлов. Еще одна идея, которую я имел, заключалась в хранении файлов в базе данных и использовании веб-службы для их обслуживания и создания файла на диске по первому запросу. После первого запроса файла веб-служба будет обслуживать файл с диска, а не из базы данных.

Есть ли у кого-нибудь идеи о том, каким может быть лучший способ добиться этого? Или какие-нибудь лучшие идеи?

Заранее благодарю вас за любые отзывы, которые могут возникнуть по этому вопросу.

+0

Попытка не пропустить очевидное здесь, но указали ли вы, что у вас нет общей файловой системы, доступной для всех трех приложений?Являются ли они файлами, которые должны быть защищены с помощью аутентификации или их можно обслуживать с статического ресурса? – MattMcKnight

+0

Не требуется аутентификация, кроме того, что может быть предоставлено в самих приложениях. Их можно было бы обслуживать с статического актива, который, я думаю, является тем, чего я на самом деле пытаюсь достичь. –

ответ

1

Я рекомендовал бы положить их в общую папку, которая подается непосредственно на вашем веб-сервере переднего конца (не Rails), если у вас такая настройка, в этом примере она обслуживает местоположение, называемое файлами, указывающим на папку на диске. Затем в параметрах скрепки измените местоположение сохранения.

has_attached_file :image, 
    :url => "/files/:basename.:extension", 
    :path => "/var/htdocs/public/files/:basename.:extension" 
+0

Спасибо за вход Matt. Я думаю, что это похоже на идеальное решение, как повлияет URL-адрес для файлов? –

+0

Я решил использовать это решение. Заглянув в исходный код плагина Paperclip, я заметил, что вы можете установить полное доменное имя в качестве URL вложения. Я настроил глобальную переменную, загруженную из соответствующего файла конфигурации среды, чтобы правильно настроить домен. Спасибо за предложение Matt. –

0

Выполняете ли вы все приложения в одной системе UNIX/Linux? Пробовали ли вы создавать символические ссылки для совместного использования папки, содержащей изображения? Цель состоит в том, чтобы сохранить все изображения в одном месте. Устранение необходимости бросать сложные крючки для создания привязанности.

Скрепка по умолчанию хранит вещи по адресу: rails_root/public/system /: attachment /: id /: style /: filename Если вы используете базу данных, вам не придется беспокоиться о столкновениях. И вам просто нужно создать системную папку, которая будет использоваться каждым приложением.

Вы можете использовать общедоступную/системную папку одного приложения в качестве мастера или создать совершенно новую. С этого момента все остальные системные папки, которые не являются ведущими, будут передаваться в подчиненные папки. Как только вы выбрали своего мастера, это так же просто, как перемещение всего в каждой подчиненной папке в главную папку. Удаление подчиненных папок и замена их символической ссылкой на главную папку.

Пример команды, установленный для миграции и замены символьной ссылкой с учетом значений по умолчанию для paperclip. Вероятно, это хорошая идея, чтобы остановить сервер, прежде чем пытаться это сделать.

$ mv /path/to/slave/project/public/system/* /path/to/master/system 
$ mv /path/to/slave/project/public/system.bak 
$ ln -s /path/to/master/system /path/to/slave/project/public/system 

После того, как вы уверены, что миграция успешен вы можете удалить резервную копию:

$ rm /path/to/slave/project/public/system.bak