Ошибки объекта и перенаправление - PullRequest
0 голосов
/ 30 марта 2010

Я знаю, что если я напишу «redirect_to» вместо «render: action», я потеряю ошибки моего @ объекта.

Мой код:

  def play
    @room = params[:id][0,1]
    @current_players = CurrentPlayer.all(:conditions => {:room => @room})
  end

  def join
    @new_player = CurrentPlayer.new(:user_id => current_user.id, :team_id => nil, :room => params[:room], :mode => params[:mode], :ip => request.remote_ip)
    if @new_player.save
      @game = create_game(params[:room], params[:mode])
      if @game
        flash[:notice] = 'Game created'
        return (redirect_to :action => "game_details", :recent => true)
      else
        flash[:error] = 'Game not created'
      end
   else
     return render(:action => 'play')
   end
    redirect_to_back
  end 

Если пользователь щелкнет ссылку «присоединиться» в play.html.erb, Rails отправит запрос на действие «присоединиться», а затем, если были ошибки, мне нужно показать их пользователю.

Но я не могу написать только redirect_to, и мой код теперь:

  def join
    @new_player = CurrentPlayer.new(:user_id => current_user.id, :team_id => nil, :room => params[:room], :mode => params[:mode], :ip => request.remote_ip)
    if @new_player.save
      @game = create_game(params[:room], params[:mode])
      if @game
        flash[:notice] = 'Game created'
        return (redirect_to :action => "game_details", :recent => true)
      else
        flash[:error] = 'Game not created'
      end
   else
    # == Very ugly and not DRY (just copypaste from 'play' action) ==
    @room = params[:id][0,1]
    @current_players = CurrentPlayer.all(:conditions => {:room => @room})
    # ===
     return render(:action => 'play')
   end
    redirect_to_back
  end 

Как мне избежать этого кода?

Ответы [ 2 ]

1 голос
/ 30 марта 2010

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

def play
  @room = params[:id][0,1]
  @current_players = CurrentPlayer.all(:conditions => {:room => @room})
end

def join
  @new_player = CurrentPlayer.new(:user_id => current_user.id, :team_id => nil, :room => params[:room], :mode => params[:mode], :ip => request.remote_ip)
  if ! @new_player.save
    play
    return render(:action => 'play')
  end

  @game = create_game(params[:room], params[:mode])
  if ! @game
    flash[:error] = 'Game not created'
    return(redirect_to_back)
  end

  flash[:notice] = 'Game created'
  return redirect_to(:action => "game_details", :recent => true)
end 
1 голос
/ 30 марта 2010

Просто реорганизуйте общий код в приватный метод. Я вызываю новый метод вручную, но вы также можете вызвать его через before_filter для этих двух действий.

def play
  setup_play
end

def join
  @new_player = CurrentPlayer.new(:user_id => current_user.id, :team_id => nil, :room => params[:room], :mode => params[:mode], :ip => request.remote_ip)
  if @new_player.save
    @game = create_game(params[:room], params[:mode])
    if @game
      flash[:notice] = 'Game created'
      return (redirect_to :action => "game_details", :recent => true)
    else
      flash[:error] = 'Game not created'
    end
  else
    setup_play
    return render(:action => 'play')
  end
  redirect_to_back
end

private

def setup_play
  @room = params[:id][0,1]
  @current_players = CurrentPlayer.all(:conditions => {:room => @room})
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...