Каков наилучший способ разместить небольшое приложение ruby в Интернете?
-
22-08-2019 - |
Вопрос
У меня есть небольшое приложение ruby, которое я написал для поиска анаграмм.Это для изучения ruby, но я хотел бы разместить его в Интернете для личного использования.У меня есть некоторый опыт работы с Rails, и многие здесь рекомендовали Sinatra.Меня устраивает и то, и другое, но я не могу найти никакой информации о том, как использовать текстовый файл вместо базы данных.
Приложение довольно простое, проверяет соответствие текстовому файлу списка слов, затем находит все анаграммы.Я предполагал, что это должно быть довольно просто, но я застрял на импорте этого текстового файла в Rails (или Sinatra, если я выберу этот способ).В проекте Rails я поместил текстовый файл в lib
справочник.
К сожалению, несмотря на то, что путь в Rails кажется правильным, я получаю сообщение об ошибке:
no such file to load -- /Users/court/Sites/cvtest/lib/english.txt
(cvtest
это название проекта rails)
Вот код.Это отлично работает само по себе:
file_path = '/Users/court/Sites/anagram/dictionary/english.txt'
input_string = gets.chomp
# validate input to list
if File.foreach(file_path) {|x| break x if x.chomp == input_string}
#break down the word
word = input_string.split(//).sort
# match word
anagrams = IO.readlines(file_path).partition{
|line| line.strip!
(line.size == word.size && line.split(//).sort == word)
}[0]
#list all words except the original
anagrams.each{ |matched_word| puts matched_word unless matched_word == input_string }
#display error if
else
puts "This word cannot be found in the dictionary"
end
Решение
Учитывайте фактическую функциональность (поиск анаграмм) в методе.Вызовите этот метод из вашего веб-приложения.
В Rails вы бы создали действие контроллера, которое вызывает этот метод вместо ActiveRecord .В Sinatra вы бы просто создали маршрут, который вызывает метод.Вот пример из жизни Синатры:
get '/word/:input'
anagrams = find_anagrams(params[:input])
anagrams.join(", ")
end
Затем, когда вы получите доступ к http://yourapp.com/word/pool, на нем будет напечатано "петля, поло".
Другие советы
Я знаю, что вопрос помечен как отвеченный, но я предпочитаю следующий, поскольку он использует параметры запроса, а не параметры на основе пути, что означает, что вы можете передать параметры, используя обычную отправку формы GET:
require 'rubygems'
require 'sinatra'
def find_anagrams word
# your anagram method here
end
get '/anagram' do
@word = params['word']
@anagrams = find_anagrams @word if @word
haml :anagram
end
И следующий haml (вы можете использовать любой язык шаблонов, который вы предпочитаете).Это предоставит вам форму ввода и покажет список анаграмм, если было введено слово и сгенерирован список анаграмм:
%h1
Enter a word
%form{:action => "anagram"}
%input{:type => "text", :name => "word"}
%input{:type => "submit"}
- if @word
%h1
Anagrams of
&= @word
- if @anagrams
%ul
- @anagrams.each do |word|
%li&= word
- else
%p No anagrams found
С синатрой вы можете делать все, что угодно.Для этих примеров даже не требуется sinatra, вы могли бы создать свой собственный интерфейс rack.
require 'rubygems'
require 'sinatra'
require 'yaml'
documents = YAML::load_file("your_data.yml")
Или:
require 'rubygems'
require 'sinatra'
content = Dir[File.join(__DIR__, "content/*.textile)].map {|path|
content = RedCloth(File.read(path)).to_html
}
И так далее.