繁体   English   中英

将小型 ruby 应用程序联机的最佳方法是什么?

[英]Whats the best way to put a small ruby app online?

我有一个小的 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

将实际功能(查找字谜)分解为方法。 从您的 Web 应用程序中调用该方法。

在 Rails 中,您将创建一个调用该方法而不是 ActiveRecord 的 controller 操作。 在 Sinatra 中,您只需创建一个调用该方法的路由。 这是一个 Sinatra 示例:

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

然后,当您访问http://yourapp.com/word/pool时,它将打印“loop, polo”。

我知道问题被标记为已回答,但我更喜欢以下内容,因为它使用查询参数而不是基于路径的参数,这意味着您可以使用常规 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,您可以做任何事情。 这些示例甚至不需要 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
}

等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM