2009-04-01 2 views
3

У меня есть небольшое рубиновое приложение, которое я написал, это искатель анаграмм. Это для обучения рубину, но я хотел бы поставить его онлайн для личного использования. У меня есть опыт работы с Rails, и многие из них рекомендовали Sinatra. Я тоже в порядке, но я не могу найти никакой информации о том, как использовать текстовый файл вместо базы данных.Каков наилучший способ разместить небольшое рубиновое приложение онлайн?

Приложение довольно простое, проверяет текстовый файл списка слов, затем находит все анаграммы. Я предполагаю, что это должно быть довольно просто, но я застрял на импортировании этого текстового файла в Rails (или Sinatra, если я так выбираю). В проекте Rails я поместил текстовый файл в каталог lib.

К сожалению, даже если путь кажется правильным в Rails, я получаю сообщение об ошибке:

no such file to load -- /Users/court/Sites/cvtest/lib/english.txt 

(cvtest это название проекта рельсы)

Вот код. Он отлично работает сам по себе:

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 

ответ

5

Фактор фактической функциональности (поиск анаграмм) в метод. Вызовите этот метод из своего веб-приложения.

В Rails вы должны создать действие контроллера, которое вызывает этот метод вместо ActiveRecord. В Sinatra вы просто создадите маршрут, который вызывает метод. Вот пример Sinatra:

get '/word/:input' 
    anagrams = find_anagrams(params[:input]) 
    anagrams.join(", ") 
end 

Затем, когда вы получаете доступ к http://yourapp.com/word/pool, он будет печатать «зацикливание, поло».

3

С помощью синатра вы можете все. Эти примеры даже не требуют синатра, вы можете свернуть свой собственный интерфейс в стойке.

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 
} 

Etcetera.

5

Я знаю, что вопрос помечается как ответил, но я предпочитаю следующее, так как он использует параметры запроса, а не параметры тракта на основе, что означает, что вы можете передать параметры при помощи регулярной формы представления 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