Предотвратить действие контроллера от непосредственного выполнения пользователем в Rails - PullRequest
1 голос
/ 24 ноября 2010

У меня есть ситуация, когда мне нужно запретить пользователям явно вызывать say / town / addBuilding.Город - это мой контроллер, а 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

Действие контроллера таверны - это просто простой код, который я хочу выполнить, но только если перенаправление происходит внутри контроллера приложения.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2010

Кажется, вы пытаетесь поместить логику в контроллер, который на самом деле должен принадлежать модели или библиотеке.

Почему я так говорю: кроме 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)
0 голосов
/ 24 ноября 2010

Поместите метод addBuilding в строку, начинающуюся с защищенного, следующим образом:

protected
def addBuilding
   #your code
end

Наслаждайтесь!

РЕДАКТИРОВАТЬ: В дополнение к этому вы также можете захотетьиспользуйте before_filter в ваших контроллерах ... Я скоро опубликую точный синтаксис.

 before_filter :addBuilding, :only => :method_name

method_name - это метод, из которого можно получить доступ к addBuilding, никакой другой метод не может получить доступ к этому методу после добавления в этомline ..

EDIT: Хорошо, поэтому, исходя из предоставленной вами информации, protected работать не будет, поскольку, если мы поместим ваше секретное действие в protected, будет работать только контроллер tavernиметь доступ к нему.

РЕДАКТИРОВАТЬ: Пожалуйста, рассмотрите возможность использования сеансов, чтобы проверить, есть ли у пользователей действительный сеанс, когда они пытаются выполнить действие monsterAttack.

...