2016-05-23 2 views
0

Я создаю игровое приложение, которое содержит несколько уровней. Я хочу, чтобы моя игра перешла на следующий уровень, когда пользователь предоставил правильный ответ. В это время мой код может перейти от уровня 1 к уровню 2, но один раз на уровне 2 он не может перейти за пределы уровня до уровня 3. Даже когда предоставляется правильный ответ, игра не будет проходить за пределами уровня 2.Как запустить метод несколько раз в контроллере Rails

Вот мой код контроллера:

class Game1Controller < ApplicationController 
    def play 
     @game1 = Game1lv.find(params[:level]) 
     @game1l = Game1lv.where(:level => @game1).limit(1).pluck(:imagelink) 
     @game1a = Game1lv.where(:level => @game1).limit(1).pluck(:answer) 
     @game1link = @game1l[0].to_s 
     @game1answer = @game1a[0].to_s 
     @game1answer_user = params["answer"] 

     if @game1answer_user == @game1answer 
      redirect_to game1_play_path(@game1.level += 1), :flash => { :success => "You are right! Now try the next question" } 
     end 
    end 
end 

Я пытался использовать for петлю внутри моего метода воспроизведения, но Rails побудила ошибку:

Render and/or redirect were called multiple times in this action.

Что я делаю не так, и как я могу сделать это так, что мои пользователи могут перейти за пределы 2-го уровня?

+0

Вы должны сделать это из своей «формы». В вашем ответе, собирающем 'form', динамически выставляем' form_url' в качестве пути метода воспроизведения. – Emu

ответ

2

попробовать что-то вроде этого:

def play 
    @game1 = Game1lv.find(params[:level]) 
    @game1link = @game1.imageLink 
    @game1answer = @game1.answer 

    @game1answer_user = params["answer"] 

    if @game1answer_user == @game1answer 
    @game1.update({ level: @game2.level + 1 }) 

    redirect_to game1_play_path(@game1.level), :flash => { :success => "You are right! Now try the next question" } 
    end 
end 

было сделано несколько улучшений. Вместо того, чтобы запрашивать базу данных по отдельности для каждого поля, код теперь извлекает эти поля из исходного запроса. Это стандартная функциональность ActiveRecord.

Кроме того, линия @game1.update используется для увеличения уровня и сохранения нового уровня в базе данных. Это лаконичное и предпочтительный вариант этого кода:

@game1.level += 1 
@game1.save! 

Уровень должен быть сохранен в базу данных после того, как она увеличивается, или приращение теряется, когда действие перенаправляет.

Смежные вопросы