Sinatra不知道这一点



有人会检查我是否做错了什么?

我的app.rb:

require 'sinatra/base'
require 'sinatra/flash'
require './lib/hangperson_game.rb'
class HangpersonApp < Sinatra::Base
  enable :sessions
  register Sinatra::Flash
  before do
    @game = session[:game] || HangpersonGame.new('')
  end
  after do
    session[:game] = @game
  end
  get '/' do
    redirect '/new'
  end
  get '/new' do
    erb :new
    #"Hello World!"
  end
  post '/create' do
    @game = HangpersonGame.new(word)
    redirect '/show'
  end
  post '/guess' do
    letter = params[:guess].to_s[0]
    begin
      if letter.nil? || letter.empty? || !((letter=~/^[A-z]$/) == 0)
        flash[:message] = "Invalid guess." 
      elsif !(@game.guess(letter))
        flash[:message] = "You have already used that letter."
      end
    end
    redirect '/show'
  end
  get '/show' do
    ### YOUR CODE HERE ###
    if (@game.check_win_or_lose == :win)
      redirect '/win'
    elsif (@game.check_win_or_lose == :lose)
      redirect '/lose'
    else
      erb :show 
    end
  end
  get '/win' do
    ### YOUR CODE HERE ###
    if (@game.check_win_or_lose != :win)
      redirect '/show'
    else
      erb :win 
    end
  end
  get '/lose' do
    if (@game.check_win_or_lose != :lose)
      redirect '/show'
    else
      erb :lose 
    end
  end
end

问题是您没有将任何action(即 url (提供给form,因此当您单击New Game按钮时,它将信息发送回到本身就是new操作,但是使用POST而不是GET,从而给您带来了错误。

添加您需要的 action(我假设是 /create(在 new视图中的形式中,如这样:

<form method="post" action="/create">
  <input type="submit" value="New Game"/>
</form>

这样,单击New Game后,该表格将发送到create操作。

如果创建模块化样式sinatra应用程序(可以在此处阅读(,则应在类的末尾声明此行(内部(:

run! if app_file == $0

现在您可以使用ruby my_modular/application.rb运行您的应用程序以及rackup -p 4567

相关内容

最新更新