1

ユーザーが /town/addBuilding などを明示的に呼び出さないようにする必要がある状況があります。Town はコントローラーで、addBuilding は実行されるアクションです。

さて、問題は、このアクションはプログラムのコードでのみ実行されるべきであり、実行を要求するユーザーによって実行されるべきではないということです。また、このアクションはコールバックのように実行されます。私の application_controller では、何らかの条件が満たされると、コントローラー アクションがトリガーされ、リダイレクトが行われます。PHP では、ガードを定義してチェックするような単純なガードで十分です。レールに同等のものはありますか?もしそうなら、それを実装する最良の方法は何ですか?

読んでくれてありがとう。あなたの助けに感謝します:)

編集: わかりやすくするためにいくつかのコードを貼り付けています。/town/addBuilding は例であり、以下のコントローラー名とアクションの名前は異なることに注意してください。

これが実際のアプリケーション コントローラー コードです。これは、私がコーディングしているブラウザー ゲームの一部です。

def checkQuest
if TavernQuest.hasQuest(current_user)
  quest = TavernQuest.getQuest(current_user)
  if quest.end_time < Time.now # get quest info and check if the quest has been completed
    TavernQuest.deleteQuest(current_user)
    redirect_to :controller => 'tavern', :action => 'monsterAttack'
  end
end
end

居酒屋コントローラーのアクションは、実行したい単純なコードにすぎませんが、リダイレクトがアプリケーションコントローラー内で発生した場合のみです。

4

2 に答える 2

0

次のように、addBuilding メソッドを protected で始まる行の下に配置します。

protected
def addBuilding
   #your code
end

楽しみ!

編集:これに加えて、コントローラーで before_filter を使用することもできます...正確な構文はすぐに投稿します。

 before_filter :addBuilding, :only => :method_name

method_name は :addBuilding にアクセスできるメソッドです。この行に追加した後、他のメソッドはこのメソッドにアクセスできません..

編集:あなたが提供した情報に基づいて、コントローラーだけがアクセスできるようにprotected秘密のアクションを配置すると機能しません。protectedtavern

編集:セッションを使用して、ユーザーがアクションを実行しようとしたときに有効なセッションがあるかどうかを確認することを検討してくださいmonsterAttack..

于 2010-11-24T03:29:29.860 に答える
0

モデルまたはライブラリに実際に属すべきコントローラーにロジックを入れようとしているようです。

なぜ私はこれを言うのですか: current_user とリダイレクトを除いて、すべてのコードはコントローラーではなくモデル (知識があるべき場所) に関連しています。モデルは、ユーザーのクエストがいつ期限切れになるかを知っています。

実装例:

class TavernQuest

  def self.user_quest_is_expired?(user)
    quest = getQuest(current_user)
    if quest && quest.end_time < Time.now 
      TavernQuest.deleteQuest(current_user)
      true
    else
      false
    end
  end
end

そしてあなたのコントローラーであなたはただ書く必要があります

redirect_to :controller => 'tavern', :action => 'monsterAttack' if TavernQuest.user_quest_is_expired?(current_user)
于 2010-11-24T12:42:53.277 に答える