Как использовать публичный метод экземпляра Rails?в случае если - PullRequest
0 голосов
/ 29 мая 2018

Как использовать метод Ruby on Rails?в операторе if else?

Я пытался использовать этот StackOverflow anwser в моем примере ниже:

if condition
  does something
elsif redirect_to(records_path)
  performed?
  does another thing
else
  yet another thing
end

Но это только перенаправляет без проверки выполнения.

Я хочу, чтобы он проверил, выполняется ли перенаправление на records_path и, когда true, что-то делает (или «делает что-то другое» в моем примере)

Я также пробовал это:

elseif records_path.performed?

А это:

elseif redirect_to(records_path) performed?()

И все между ними.

Может кто-нибудь объяснить, как это делается и как я мог получить это из документов ?

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

performed? просто тестирует, если визуализация или перенаправление уже произошло.Это не проверяет, какое представление было отправлено пользователю.Эта проверка только «вы сами определяете путь, или это должно быть сделано автоматически».

Попробуйте что-то вроде этого:

if condition
  does something
  redirect_to(records_path)
end
if performed?
  does another thing
else
  yet another thing
end
0 голосов
/ 29 мая 2018

В действии контроллера, когда мы набираем render или redirect_to, они выполняются не сразу, а ставятся в очередь и будут выполняться после завершения метода.Таким образом, это позволяет иметь двойной рендер или redirect_to в действии контроллера, и это приведет к ошибке (потому что тогда rails не имеет представления, что выполнять).Вот почему в рельсах они добавили метод performed?, который будет указывать, был ли render или redirect_to уже вызван (в очереди) или нет.

В большинстве случаев это на самом деле не нужно, потому что обычно код вашего контроллера довольно прост.

Чтобы уточнить: performed? на самом деле не проверяет, что redirect_to было выполнено, он просто проверяет, что рендер или перенаправление на вызвано / поставлено в очередь.Кроме того, redirect_to не возвращает логическое значение, указывающее, было ли это сделано или нет.

Таким образом, ваш код должен выглядеть следующим образом:

if condition
  does something
else 
  redirect_to(records_path)
end 
if performed?
  # the redirect-to was executed
  does another thing # but not a render or redirect
else
  yet another thing 
  # and could be a render or redirect 
  # if not the normal view will be rendered
end

Пожалуйста, обратите внимание, что в этом простом примере performed? является просто отрицательным значением condition, так что вы можете легко сложить их вместе.

0 голосов
/ 29 мая 2018

Это означает, что действие вашего контроллера (A) может вызывать другие методы контроллера (M), а затем выполнять рендеринг или перенаправление в (A), только если ни один из (M) не выполнил рендеринг / перенаправление.

Прочитайте исходный код, он довольно прост и понятен: https://apidock.com/rails/ActionController/Metal/performed%3F

Например:

class ArticlesController < ApplicationController                                                                                                                                                                                  
  def show                                                                                                                                                                                                                        
    check_identity                                                                                                                                                                                                                
    render :show unless performed?                                                                                                                                                                                                
  end                                                                                                                                                                                                                             

  def check_identity                                                                                                                                                                                                              
    redirect_to root_path, notice: "You're not allowed to be here" unless user_signed_in?                                                                                                                                         
  end                                                                                                                                                                                                                             
end
...