Domanda

Ho una piccola applicazione rubino ho scritto che è un ricercatore anagramma. E 'per l'apprendimento rubino, ma vorrei mettere in su in linea per uso personale. Ho una certa esperienza con Rails, e molti qui hanno raccomandato Sinatra. Io sto bene con entrambi, ma non riesco a trovare tutte le informazioni su come utilizzare un file di testo al posto di un database.

L'applicazione è molto semplice, convalida nei confronti di un file di testo di un elenco di parole, poi trova tutti gli anagrammi. Ho presupposto che questo dovrebbe essere abbastanza semplice, ma mi sono bloccato su come importare file di testo che in Rails (o Sinatra se scelgo questo modo). Nel progetto Rails, ho messo il file di testo nella directory lib.

Purtroppo, anche se il percorso sembra essere corretto in Rails, ottengo un errore:

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

(cvtest è il nome del progetto rotaie)

Ecco il codice. E le grandi opere di per sé:

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
È stato utile?

Soluzione

Factor l'effettiva funzionalità (trovare gli anagrammi) in un metodo. Chiamare questo metodo dal Web app.

In Rails, devi creare un azione di controllo che chiama questo metodo, invece di ActiveRecord. In Sinatra, si era appena creare un percorso che chiama il metodo. Ecco un esempio Sinatra:

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

Poi, quando si accede al http://yourapp.com/word/pool , lo farà print "loop, polo".

Altri suggerimenti

So che la questione è contrassegnata come risposta, ma io preferisco la seguente, in quanto utilizza parametri di query piuttosto che parametri di percorso base, il che significa che è possibile trasferire i parametri utilizzando un normale invio di un modulo 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

E la seguente Haml (si può usare qualsiasi linguaggio di template che preferite). Questo vi darà un modulo di input, e mostrare la lista di anagrammi se una parola è stata fornita e una lista anagramma è stato generato:

%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

Con Sinatra, si può fare nulla. Questi esempi non ha nemmeno bisogno di Sinatra, si potrebbe rotolare il proprio cosa interfaccia rack.

require 'rubygems'
require 'sinatra'
require 'yaml'

documents = YAML::load_file("your_data.yml")

o

require 'rubygems'
require 'sinatra'
content = Dir[File.join(__DIR__, "content/*.textile)].map {|path|
  content = RedCloth(File.read(path)).to_html
}

Etcetera.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top