我写了一个小的ruby应用程序,我写的是一个anagram搜索器。这是学习红宝石,但我想把它放在网上供个人使用。我对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
答案 0 :(得分:5)
将实际功能(找到字谜)纳入方法。从您的Web应用程序调用该方法。
在Rails中,您将创建一个调用该方法而不是ActiveRecord的控制器操作。在Sinatra中,您只需创建一个调用该方法的路径。这是一个Sinatra的例子:
get '/word/:input'
anagrams = find_anagrams(params[:input])
anagrams.join(", ")
end
然后,当您访问http://yourapp.com/word/pool时,它将打印“loop,polo”。
答案 1 :(得分: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(您可以使用您喜欢的任何模板语言)。这将为您提供一个输入表单,如果已提供单词并生成了anagram列表,则显示字谜列表:
%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
答案 2 :(得分:3)
使用sinatra,你可以做任何事情。这些示例甚至不需要sinatra,您可以滚动自己的机架接口。
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
}
等等。