2017-09-25 111 views
0

我有一個.erb文件顯示以下行:設置變量閃光燈[:消息]在紅寶石

<% if flash[:message]%> 
<p><span class"error"><%= flash[:message] %></p> 
<%end%> 

我想設置變量flash[:message].rb文件,我不知道怎麼做。無論出於何種原因,Ruby中的符號都會讓我困惑不解。他們看起來像指針,但有點不同。

文件1:

class HangpersonGame 
attr_accessor :word 
attr_accessor :guesses 
attr_accessor :wrong_guesses 

    # add the necessary class methods, attributes, etc. here 
    # to make the tests in spec/hangperson_game_spec.rb pass. 
    # Get a word from remote "random word" service 
    # def initialize() 
    # end 

    def initialize(word) 
    @word = word 
    @guesses = "" 
    @wrong_guesses = "" 
    end 

    def guess(letter) 
    # make sure the letter is actually a letter 
    if letter == nil || !(letter.class == String && letter =~ /^[A-z]$/i) 
     raise ArgumentError 
    end 

    # handle different cases 
    letter.downcase! 

    # handle repeated guesses 
    if @guesses.include?(letter) || @wrong_guesses.include?(letter) 
     flash[message] = "You have already used that letter" 
     return false 
    end 

    #handle case where guess is not a letter 
    return false if letter.length != 1 

    # finally handle check and return true 
    if @word.include? letter 
     @guesses << letter 
    else 
     @wrong_guesses << letter 
    end 
    return true 
    end 

    def word_with_guesses 
    result = '' 
    @word.split('').each do |char| 
     if @guesses.include? char 
     result << char 
     else 
     result << '-' 
     end 
    end 

    return result 
    end 

    def check_win_or_lose 
    if word_with_guesses.downcase == @word.downcase 
     return :win 
    elsif @wrong_guesses.length >= 7 
     return :lose 
    else 
     return :play 
    end 
    end 

    # You can test it by running $ bundle exec irb -I. -r app.rb 
    # And then in the irb: irb(main):001:0> HangpersonGame.get_random_word 
    # => "cooking" <-- some random word 
    def self.get_random_word 
    require 'uri' 
    require 'net/http' 
    uri = URI('http://watchout4snakes.com/wo4snakes/Random/RandomWord') 
    Net::HTTP.new('watchout4snakes.com').start { |http| 
     return http.post(uri, "").body 
    } 
    end 

end 

文件2:

<h2>Guess a letter</h2> 

<% if flash[:message] %> 
    <p> 
    <span class="error"><%= flash[:message] %></span> 
    </p> 
<% end %> 

<p> 
    Wrong Guesses: 
    <span class="guesses"><%= @game.wrong_guesses %></span> 
</p> 

<p> 
    Word so far: 
    <span class="word"><%= @game.word_with_guesses %></span> 
</p> 

<form action="/guess" method="post"> 
    <input type="text" size="1" name="guess" autocomplete="off"/> 
    <input type="submit" value="Guess!"/> 
</form> 

<%= erb :new %> 

文件3:

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 

    # These two routes are good examples of Sinatra syntax 
    # to help you with the rest of the assignment 
    get '/' do 
    redirect '/new' 
    end 

    get '/new' do 
    erb :new 
    end 

    post '/create' do 
    # NOTE: don't change next line - it's needed by autograder! 
    word = params[:word] || HangpersonGame.get_random_word 
    # NOTE: don't change previous line - it's needed by autograder! 

    @game = HangpersonGame.new(word) 
    redirect '/show' 
    end 

    # Use existing methods in HangpersonGame to process a guess. 
    # If a guess is repeated, set flash[:message] to "You have already used that letter." 
    # If a guess is invalid, set flash[:message] to "Invalid guess." 
    post '/guess' do 
    letter = params[:guess].to_s[0] 
    ### YOUR CODE HERE ### 

    @game.guess(letter); 

    redirect '/show' 
    end 

    # Everytime a guess is made, we should eventually end up at this route. 
    # Use existing methods in HangpersonGame to check if player has 
    # won, lost, or neither, and take the appropriate action. 
    # Notice that the show.erb template expects to use the instance variables 
    # wrong_guesses and word_with_guesses from @game. 
    get '/show' do 
    ### YOUR CODE HERE ### 
    erb :show # You may change/remove this line 
    end 

    get '/win' do 
    ### YOUR CODE HERE ### 
    erb :win # You may change/remove this line 
    end 

    get '/lose' do 
    ### YOUR CODE HERE ### 
    erb :lose # You may change/remove this line 
    end 

end 
+0

簡單的寫像這個'flash [:message] ='message''在.rb中。怎麼了? – user1735921

+0

我曾嘗試這樣做,沒有積極的結果。我想要顯示的錯誤消息不會過濾到'.erb'。我的印象是,我可能會錯過一些簡單的事情,因爲我對Ruby仍然陌生 – TGutmann87

+0

提供錯誤和代碼。 – user1735921

回答

1

您標記了一個問題,紅寶石上軌,但是它是sinatra。 在ruby-on-rails中,您在控制器中設置了flash消息(它是會話的一部分)。你不能在模型中設置它。

我不知道Sinatra是如何工作的,但我讀到它是相似的。我發現這一點:

Flash message in Sinatra

您可以設置在控制器中的閃存消息(後「/猜」):

result = @game.guess(letter); 
if result == REPEATED then 
    session[:message] = "You have already used that letter" 
elsif result == WRONG 
    session[:message] = "Invalid guess" 
else 
    session[:message] = nil 
end 

這需要你改變的猜測方法返回不同的值,而不是隻是真或假。

然後,您可以在控制器中設置一個變量(get'/ show')在視圖中使用。我不知道這是否是強制性的(或者你可以使用session [:消息]在視圖):

@message = session[:message] 
session[:message] = nil 

最後,你在放映視圖顯示消息

<% if @message %> 
    <p> 
    <span class="error"><%= @message %></span> 
    </p> 
<% end %> 
+0

我明白你所說的一切。雖然所有這些變化都是不允許的,因爲我上面標註的文件2必須保持完整,不能更改,這是我遇到這種困境的地方。會有一種方法來傳遞一個字符串變量的消息從文件1到文件3?然後在文件3中設置flash [:message] – TGutmann87

+0

不要緊,我只是意識到我會將消息作爲字符串返回並從那裏傳遞過來。感謝您的幫助。 – TGutmann87