【问题标题】:Sinatra doesn’t know this dittySinatra 不知道这个小曲
【发布时间】:2020-08-10 10:16:00
【问题描述】:

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

我的 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

【问题讨论】:

  • 是什么触发了错误?
  • 我们需要更多信息。任何路线都有效吗?你如何运行你的应用程序?可能与 this answer 有关,但这只是在黑暗中的一个镜头。
  • 嗨 Chit Siu,欢迎来到 StackOverflow!请阅读How to Ask,以便我们更好地帮助您。
  • 我可以运行它,使用命令 $rerun -- rackup -p $PORT -o $IP
  • 更多信息:显示游戏状态,允许玩家输入猜测;可以重定向到赢或输 GET /show 显示可以生成POST /create GET /new 开始新游戏的表格;更改状态 POST /create Process guess 后重定向到 Show Game;更改状态后重定向到显示游戏 POST /guess 显示“你赢”页面,带按钮开始新游戏 GET /win 显示“你输”页面,带按钮开始新游戏 GET /lose

标签: ruby sinatra


【解决方案1】:

问题是您没有向form 提供任何action(即url),因此当您单击New Game 按钮时,它会将信息发送回自身,那是new 操作,但使用POST 而不是GET,从而给你这个错误。

new 视图中的表单中添加您需要的action(我假设是/create),如下所示:

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

这样,当你点击New Game后,表单将被发送到create action。

【讨论】:

    【解决方案2】:

    如果你创建模块化风格的 Sinatra 应用程序,(可以read about it here),你应该在你的类的 THE END 中声明这一行(在它里面):

    run! if app_file == $0
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 2020-10-23
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      相关资源
      最近更新 更多